有些事情是您在学术或培训班上没有学到的,经过几年的工作经验后才逐渐了解,然后才意识到,这是非常基本的事情,我为什么错过了这么多年。 了解多线程Java程序的执行方式就是其中之一。 您肯定已经听说过线程,如何启动线程,如何停止线程,诸如其独立的执行路径之类的定义,处理线程间通信的所有时髦库,但是在调试多线程Java程序时,您会斗争。
至少我可以从我的亲身经历中说出来。 在我看来,调试是真正的培训师,您将学到一个精妙的概念,并形成只有通过调试才能持续很长时间的理解。
在本文中,我将讨论有关任何程序执行的三个重要事项,而不仅仅是Java,线程,代码和数据。
一旦您对这三个函数如何协同工作有了很好的了解,您将更容易理解程序的执行方式,为什么某个错误仅在某些时候出现,为什么某个特定的错误会一直出现以及为什么某个特定的错误确实存在?随机。
线程,代码和数据如何协同工作
什么是程序? 简而言之,这是一段代码,将其翻译为CPU的二进制指令。 CPU是执行那些指令的人,例如从内存中获取数据,添加数据,减去数据等。总之,您编写的是您的程序,即代码。
在同一程序的不同执行之间,数据是不同的。 这不仅意味着重启程序,还意味着一个处理周期,例如,对于一个电子交易应用程序,处理一个订单就是一次执行。 您可以在一分钟内处理成千上万的订单,并且每次迭代都会改变数据。
还有一点要注意的是,您可以在代码中创建线程,然后将它们并行运行并执行代码,这些代码是在它们的run()方法内部编写的。 要记住的关键是线程可以并行运行。
当Java程序启动时,将创建一个称为主线程的线程,该线程执行在main方法内部编写的代码,如果创建线程,则这些线程由主线程创建并启动,一旦启动,它们便开始执行编写的代码其
run()方法。
因此,如果您有10个线程来处理订单,它们将并行运行。 简而言之,线程执行代码,并传入数据。现在,我们将讨论三种不同类型的问题
1)问题,总是会出现
2)问题,仅在某些时候出现,但与相同的输入内容一致
3)问题,这确实是随机的
问题一最有可能是由于错误的代码而引起的,也称为编程错误,例如访问程序的无效索引。
array ,在将其设置为null或什至在初始化之前访问Object的方法。 如您所知,它们很容易修复。
您只需要了解编程语言和API即可解决此错误。
第二个问题是数据而不是代码。 只是有时但总是带有相同的输入,可能是由于边界处理不正确,数据格式错误(例如订单)而没有某些字段(例如价格,数量等)。
您的程序应始终以健壮的方式编写,这样,如果输入的数据不正确,程序就不会崩溃。 影响只应与该订单有关,其余订单必须正确执行。
第三个问题很可能是由于多线程引起的,多线程执行的顺序和交织会导致竞争条件或死锁 。 它们是随机的,因为它们仅在某些随机事件发生时才会出现,例如,线程2在线程1之前获得CPU,从而锁定了错误的顺序。
请记住,线程调度程序和操作系统负责将CPU分配给线程,它们可以暂停它们,随时从它们中获取CPU,所有这些都可以创建一个独特的方案,从而暴露了多线程和同步问题。
您的代码从不依赖于线程等的顺序,它必须健壮才能在所有条件下完美运行。
简而言之,请记住线程使用给出的数据作为输入执行代码。 每个线程使用相同的代码,但使用不同的数据。 在调试问题时,请注意线程,代码和数据这三者。
感谢您到目前为止阅读本文。 如果您喜欢这篇文章,请与您的朋友和同事分享。 如果您有任何疑问或反馈,请留言。
翻译自: https://www.javacodegeeks.com/2019/03/multithreading-java-program-actually-run.html