这个问题还真从来没想过..直到有一天看到过这样的问题。
package com.wy.MyThread;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class MyThreadPoolExecutor {
private static int produceTaskSleepTime = 2;
private static int consumeTaskSleepTime = 2000;
private static int produceTaskMaxNumber = 10;
public static void main(String[] args) {
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(8,10,1000, TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(3));
for(int i=1;i<=produceTaskMaxNumber;i++){
try {
//产生一个任务,并将其加入到线程池
String task = "task@ " + i;
System.out.println("put " + task);
threadPool.execute(new ThreadPoolTask(task));
//便于观察,等待一段时间
Thread.sleep(produceTaskSleepTime);
}catch (Exception e){
e.printStackTrace();
}
}
}
/**
* 线程池执行的任务
*/
private static class ThreadPoolTask implements Runnable {
private static final long serialVersionUID = 0;
//保存任务所需要的数据
private Object threadPoolTaskData;
public ThreadPoolTask(Object tasks) {
this.threadPoolTaskData = tasks;
}
public void run() {
//处理一个任务,这里的处理方式太简单了,仅仅是一个打印语句
System.out.println("start .." + threadPoolTaskData);
if(threadPoolTaskData.equals("task@ 1")){
System.out.println( threadPoolTaskData );
//如果线程池中某个线程出现异常会怎样?
Thread.currentThread().interrupt();
}
try {
便于观察,等待一段时间
Thread.sleep(consumeTaskSleepTime);
} catch (Exception e) {
e.printStackTrace();
}
threadPoolTaskData = null;
}
public Object getTask(){
return this.threadPoolTaskData;
}
}
}
大部分代码来自https://my.csdn.net/mmc_maodun 该博主中并发编程博客中的一篇。
运行结果
"C:\Program Files\Java\jdk1.8.0_144\bin\java" "-javaagent:D:\Program Files\idea\IntelliJ IDEA 2017.3\lib\idea_rt.jar=8565:D:\Program Files\idea\IntelliJ IDEA 2017.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_144\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\rt.jar;E:\IdeaSpace\algorithm\out\production\untitled104" com.wy.MyThread.MyThreadPoolExecutor
put task@ 1
start ..task@ 1
task@ 1
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at com.wy.MyThread.MyThreadPoolExecutor$ThreadPoolTask.run(MyThreadPoolExecutor.java:62)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
put task@ 2
start ..task@ 2
put task@ 3
start ..task@ 3
put task@ 4
start ..task@ 4
put task@ 5
start ..task@ 5
put task@ 6
start ..task@ 6
put task@ 7
start ..task@ 7
put task@ 8
start ..task@ 8
put task@ 9
start ..task@ 9
put task@ 10
start ..task@ 10
Process finished with exit code 1
说明在线程池中,一个线程出现问题不会导致其他线程的正常执行。线程是独立运行的基本单位。