使用线程池中的线程执行任务时,使用Runnable接口无法正常打印结果,调试发现运行到一半程序就中断了(最恶心的是多次运行,大部分时候失败,但有时也能成功,让我一度怀疑是不是我的JDK坏了),而使用Callable接口可以完美进行。
经过了各种尝试,最终发现是Junit的问题,这个鬼东西会在主线程结束后调用相关的System.exit()方法,将JVM关闭,所以,emmm,子线程被动挂了。
那为何Callable接口可以完美进行嘞?因为它必须返回一个值,才可以使主程序继续进行,所以起到了一个阻塞的作用。。。
最后,解决办法:
1避免在Junit中测试多线程问题
2非要作死这样搞就让主线程休眠一阵子,至于休眠多久才能够子线程嘞,鬼知道,所以果断选择1.
@Test
public void test1() throws Exception {
//创建线程池
ExecutorService pool = Executors.newFixedThreadPool(5);
//为线程池中的线程分配任务
//使用Runnable接口
/*pool.submit(new Runnable() {
@Override
public void run() {
int sum = 0;
for (int i = 0; i <= 10; i++){
sum += i;
System.out.println(i);
}
System.out.println(sum);
}
});*/
//使用Callable接口
Future<Integer> rst = pool.submit(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
int sum = 0;
for (int i = 0; i < 10; i++)
sum += i;
return sum;
}
});
try {
System.out.println(rst.get());
} catch (Exception e) {
e.printStackTrace();
}
//关闭线程池
pool.shutdown();
}