今天来了解一下Java提供的一个创建单线程池的方法–newSingleThreadExecutor,通过这个方法创建的线程池允许线程在死亡或者发生异常后,重新启动一个新的线程来代替原来的线程并继续执行下去。
本文将从以下3个方面来介绍。
一、 简单使用用例
二、 查阅源码
三、 使用场景分析
一、 简单使用用例
Java代码:
Executor mSingleThreadPool = (Executor) Executors.newSingleThreadExecutor();
mSingleThreadPool.execute(new Runnable() {
@Override
public void run() {
Random random = new Random(100L);
int randomNum;
int temp = 0;
while (temp < 10) {
randomNum = random.nextInt(3);
Log.d("SingleThreadTest", "temp : " + temp + ", randomNum : " + randomNum);
try{
int result = temp++ / randomNum;
} catch (ArithmeticException e) {
e.printStackTrace();
}
}
}
});
log日志:
SingleThreadTest: temp : 0, randomNum : 1
SingleThreadTest: temp : 1, randomNum : 1
SingleThreadTest: temp : 2, randomNum : 1
SingleThreadTest: temp : 3, randomNum : 0
System.err: java.lang.ArithmeticException: divide by zero
System.err: at com.example.vipdemo.pay.TestActivity$1$override.run(TestActivity.java:36)
System.err: at com.example.vipdemo.pay.TestActivity$1$override.access$dispatch(TestActivity.java)
System.err: at com.example.vipdemo.pay.TestActivity$1.run(TestActivity.java:0)
System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
System.err: at java.lang.Thread.run(Thread.java:818)
SingleThreadTest: temp : 4, randomNum : 1
SingleThreadTest: temp : 5, randomNum : 0
System.err: java.lang.ArithmeticException: divide by zero
System.err: at com.example.vipdemo.pay.TestActivity$1$override.run(TestActivity.java:36)
System.err: at com.example.vipdemo.pay.TestActivity$1$override.access$dispatch(TestActivity.java)
System.err: at com.example.vipdemo.pay.TestActivity$1.run(TestActivity.java:0)
System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
System.err: at java.lang.Thread.run(Thread.java:818)
SingleThreadTest: temp : 6, randomNum : 2
SingleThreadTest: temp : 7, randomNum : 2
SingleThreadTest: temp : 8, randomNum : 1
SingleThreadTest: temp : 9, randomNum : 1
从log可以看出,当线程发生异常时,程序并没有停止,而是继续往下执行,是不是感觉很神奇,接下来从源码的角度来分析newSingleThreadExecutor这个方法的工作原理
二、 查阅源码
Executors.java
...
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
...
这里就是newSingleThreadExecutor的源码了
–未完待续–