猿问

JAVA多线程异常处理

需求:

有一个list集合,有三个检查方法checkA(list), checkB(list), checkC(list),三个方法从不同角度去检测list中的数据是否合法,当全部检查都通过时,再进行后续的操作。

解决方案:

我现在想用ExecutorService创建三个线程分别调用三个检查方法,提高效率。任何一个方法中发现无效数据直接抛一个异常结束该线程。

问题:在主线程调用三个线程后,如何在主线程中catch住其中一个线程的异常,并将其他两个线程立即停止?

看了一下executorservice的shutdown()方法和shutdownnow(),我理解的是,这两个方法都不能保证立即停止线程,不知道我的理解对吗?

往前迈一步
浏览 962回答 1
1回答

是王小二呀

这么说吧,CPU单核心时,设计一个全局变量作为状态值,比如期望值为0,三个线程分别遍历检查list,每次遍历都去读这个状态值,只要三个线程有那一个在遍历过程中出错,即改变此状态值,此时其他两个线程便能监控到状态变量的改变,此时跳出遍历,结束线程即可。CPU多核心时,三个线程有可能分给三个核心去执行,此时涉及到竞写,可以对状态值加锁,也可在主线程再维护一个volatile变量,然后在主线程中为三个线程各自维护一个状态变量,check方法遍历时去检测volatile变量,当主线程监测到三个线程其中一个check出错改变自己的状态变量值时,主线程即改变此volatile变量,这时候呢由于这个变量的特性,其他两个线程会立即得到volatile变量值的变化,由此跳出遍历并结束线程。
随时随地看视频慕课网APP

相关分类

Java
我要回答