线程问题,线程已经取消了,也返回取消成功了,却还在继续运行,求救啊..:)
import java.util.Iterator;
import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
public class PDFTool2 {
private final static Integer ThreadNum = 3;
private final static ExecutorService exec = Executors.newCachedThreadPool();//创建线程池
public static void main(String[] args) throws Exception {
//存放结果的队列
ConcurrentLinkedQueue<Future<Integer>> queue = new ConcurrentLinkedQueue<Future<Integer>>();
runDaemon(queue);
for(int i=0; i<ThreadNum; i++){
Future<Integer> future = exec.submit(getTask());
queue.add(future);
}
}
//运行后台线程,用于控制线程个数
public static void runDaemon(final ConcurrentLinkedQueue<Future<Integer>> queue){
Thread thread = new Thread(new Runnable(){
public void run() {
while(true){
try {
TimeUnit.SECONDS.sleep(5);//10秒监听一次
} catch (InterruptedException e) {e.printStackTrace();}
int UserThreadNum = getUserThreadNum();//用户输入的线程个数
int CurrentThreadNum = queue.size();//当前的线程个数
System.out.println("监听线程启动:当前有"+CurrentThreadNum+"个线程."+(UserThreadNum>0?"用户输入了"+UserThreadNum+"个线程.":""));
if(UserThreadNum > CurrentThreadNum){//添加几个线程
for(int i=0; i<(UserThreadNum-CurrentThreadNum); i++){
Future<Integer> future = exec.submit(getTask());
queue.add(future);
System.out.println("添加了一个任务-------------------------");
}
}else if(UserThreadNum < CurrentThreadNum){//关闭几个线程
for(int i=0; i<(CurrentThreadNum-UserThreadNum); i++){
Future<Integer> future = queue.poll();
if(future != null){
boolean isSucc = future.cancel(true);//该任务被取消
System.out.println("取消了一个任务-------------------------"+isSucc);
}
}
}
//如果任务中有完成的,则把它踢出队列中
Iterator<Future<Integer>> iter = queue.iterator();
boolean isComp = false;
while(iter.hasNext()){
Future<Integer> future = iter.next();
if(future!=null && future.isDone()){
boolean isRemove = queue.remove(future);
System.out.println("一个任务已经完成,被移除.........."+isRemove);
isComp = true;
}
}
if(!isComp){System.out.println("没有一个任务已完成............");}
}
}}
);
thread.setDaemon(true);//设为后台线程
thread.start();
}
//获得用户输入的线程个数
public synchronized static int getUserThreadNum(){
return 2;
}
//获得任务
public static Callable<Integer> getTask(){
Callable<Integer> task = new Callable<Integer>(){
public Integer call() throws Exception {
process();
return 0;
}
};
return task;
}
//处理过程
public static void process(){
try {
TimeUnit.SECONDS.sleep(3);
System.out.println(Thread.currentThread().getName()+"完成.");
} catch (Exception e) {
e.printStackTrace();
}
process();
}
}
下面的是运行结果:
pool-1-thread-3完成.
pool-1-thread-1完成.
pool-1-thread-2完成.
监听线程启动:当前有3个线程.用户输入了2个线程.
取消了一个任务-------------------------true
没有一个任务已完成............
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at java.lang.Thread.sleep(Thread.java:298)
at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:328)
at pdf.PDFTool2.process(PDFTool2.java:83)
at pdf.PDFTool2.process(PDFTool2.java:88)
at pdf.PDFTool2$2.call(PDFTool2.java:75)
at pdf.PDFTool2$2.call(PDFTool2.java:1)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)
pool-1-thread-2完成.
pool-1-thread-3完成.
pool-1-thread-1完成.
pool-1-thread-2完成.
pool-1-thread-3完成.
监听线程启动:当前有2个线程.用户输入了2个线程.
没有一个任务已完成............
pool-1-thread-1完成.
pool-1-thread-2完成.
pool-1-thread-3完成.
pool-1-thread-1完成.
pool-1-thread-2完成.
监听线程启动:当前有2个线程.用户输入了2个线程.
没有一个任务已完成............
pool-1-thread-3完成.
pool-1-thread-1完成.
pool-1-thread-2完成.
pool-1-thread-3完成. 多线程 关闭任务
[解决办法]
表达有误。
[解决办法]
初步看了下,你的异常全部被你catch住了又不外抛,不外抛就应该在catch里做退出处理