写二叉树程序时为什么总是报运行时错误_线程、代码和数据——多线程Java程序的实际运行方式...

你肯定听说过线程、如何启动线程、如何停止线程、诸如独立执行路径之类的定义,以及处理线程间通信的所有时髦的库,但是在调试多线程Java程序时,你会遇到困难。

至少我可以从我的个人经历中这么说。调试在我看来是真正的培训师,只有通过调试,你才能学习到一个微妙的概念,并形成一种持久的理解。

在本文中,我将讨论关于任何程序执行的三件重要的事情,而不仅仅是Java、线程、代码和数据。

一旦你很好地理解了这三者是如何协同工作的,你就会更容易理解一个程序是如何执行的,为什么某个bug只是偶尔出现,为什么某个bug总是出现,为什么某个bug是真正随机的。

线程、代码和数据如何协同工作

什么是程序?简而言之,它是一段代码,被转换成CPU的二进制指令。CPU执行这些指令,例如从内存中获取数据、添加数据、减去数据等等。简而言之,你写的是你的程序,代码。

相同程序的不同执行之间的差异是数据。这不仅仅意味着重新启动程序,还意味着一个处理周期,例如,对于一个电子交易应用程序,处理一个订单就是执行一个订单。你可以在一分钟内处理数千个订单,并且在每次迭代中,数据都会发生变化。

另外需要注意的是,您可以在代码中创建线程,然后这些线程将并行运行并执行在run()方法中编写的代码。要记住的关键是线程可以并行运行。

当Java程序启动时,会创建一个名为主线程的线程,该线程执行在main方法中编写的代码,如果您创建一个线程,那么这些线程将由主线程创建并启动,一旦启动,它们将开始执行在run()方法中编写的代码。

69717e08f2bb1865b8bf536e8a72ff67.png

因此,如果有10个线程用于处理订单,它们将并行运行。简而言之,线程执行带有数据的代码。我们会看到三种不同的问题

1)问题总是会出现

2)问题它只是偶尔出现,但与相同的输入是一致的

3)问题这真的是随机的

第一个问题很可能是由于错误的代码,也称为编程错误,如访问无效的数组索引,访问对象的方法后,使其为空,甚至在初始化它之前。它们很容易修理,你知道它们的位置。

你只需要了解编程语言和API就可以修复这个错误。

第二个问题更可能与数据有关,而不是代码。只有在某些情况下,总是有相同的输入,可能是由于不正确的边界处理,不正确的数据,如订单没有特定字段,如价格、数量等。

你的程序应该健壮地编写,以便在输入不正确的数据时不会崩溃。影响应该只与订单有关,订单的其余部分必须正确执行。

第三个问题更有可能出现是因为多线程,其中多个线程执行的顺序和交错会导致竞争条件或死锁。它们是随机的,因为它们只有在某些随机事件发生时才会出现,例如线程2在线程1之前获得CPU,以错误的顺序获得锁。

请记住,线程调度程序和操作系统负责将CPU分配给线程,它们可以暂停线程,在任何时候从线程获取CPU,所有这些都可以创建一个独特的场景,这暴露了多线程和同步问题。

你的代码从不依赖于线程的顺序等,它必须是健壮的,在所有条件下完美运行。

简而言之,请记住,线程执行的代码将数据作为输入。每个线程使用相同的代码,但使用不同的数据。调试问题时,注意线程、代码和数据三者。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值