请教各位 java 线程池 出现异常的问题! 问题如下: 为啥会出现异常??
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教各位 java 线程池 出现异常的问题! 问题如下: 为啥会出现异常??相关的知识,希望对你有一定的参考价值。
package text1.thread;
public class LiftOff implements Runnable
protected int countDown = 10;
private static int taskCount = 0;
private final int id = taskCount++;
public LiftOff()
public String status()
return "#" + id + "(" + (countDown > 0 ? countDown : "发射!") + "),";
@Override
public void run()
while(countDown-- > 0)
System.out.println(status());
Thread.yield();
---------------------------------------------
package text1.thread;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CachedThreadPool
/**
* @param args
*/
public static void main(String[] args)
ExecutorService exec = Executors.newCachedThreadPool();
for(int i = 0; i < 5; i++)
exec.execute(new LiftOff());
exec.shutdown();
--------------------------------------------
Exception in thread "main" java.util.concurrent.RejectedExecutionException
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:1760)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:767)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:658)
at text1.thread.CachedThreadPool.main(CachedThreadPool.java:15)
#0(9),
#0(8),
#0(7),
#0(6),
#0(5),
#0(4),
#0(3),
#0(2),
#0(1),
#0(发射!),
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CachedThreadPool
/**
* @param args
*/
public static void main(String[] args)
ExecutorService exec = Executors.newCachedThreadPool();
for(int i = 0; i < 5; i++)
exec.execute(new LiftOff());
//exec.shutdown(); 这句有问题 不能每次执行后就把线程池关闭了啊。这样就只能执行一个任务,其他任务都被拒绝了。 改在执行完后再关闭池。
exec.shutdown();
应该是你的exec.shutdown();这句位置问题,不能放在循环的内部。
Java线程池异常处理的正确姿势
问题分析
protected void afterExecute(Runnable r, Throwable t) { }
存在问题
如何避免这种问题
直接catch
但是这种思路的缺点就是:
1)所有的不同任务类型都要trycatch,增加了代码量。
2)不存在checkedexception的地方也需要都trycatch起来,代码丑陋。
线程池实现
实现Thread.UncaughtExceptionHandler接口
实现void uncaughtException(Thread t, Throwable e);方法,
并将该handler传递给线程池的ThreadFactory
继承ThreadGroup
尤其注意:上面三种方式针对的都是通过execute(xx)的方式提交任务,如果你提交任务用的是submit()方法,那么上面的三种方式都将不起作用,而应该使用下面的方式
采用Future模式
采用Future模式,将返回结果以及异常放到Future中,在Future中处理
总结
以上是关于请教各位 java 线程池 出现异常的问题! 问题如下: 为啥会出现异常??的主要内容,如果未能解决你的问题,请参考以下文章
JAVA 线程池 其中一个线程执行失败 则线程重新执行或者重新提交任务 急
各位大侠,请教个oracle问题,执行一段代码出现错误,希望各位给出解决办法,谢谢谢!