import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
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;
import org.apache.commons.io.IOUtils;
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(){
int ThreadNum = 0;
String path = PDFTool1.class.getClassLoader().getResource("").getPath().replace("bin/", "");
path += "src/pdf/ThreadNum.txt";
try {
List<String> list = IOUtils.readLines(new FileInputStream(path));
if(list != null && list.size() > 0){
ThreadNum = Integer.parseInt(list.get(0));
}
} catch (FileNotFoundException e) {e.printStackTrace();
} catch (IOException e) {e.printStackTrace();
} catch (Exception e) {e.printStackTrace();}
return ThreadNum;
}
//获得任务
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 (InterruptedException e) {
// e.printStackTrace();
return;//如果线程被interrupt,那么终止该线程
}
process();
}
/**
* 运行结果:
* pool-1-thread-3完成.
pool-1-thread-1完成.
pool-1-thread-2完成.
监听线程启动:当前有3个线程.用户输入了2个线程.
取消了一个任务-------------------------true
没有一个任务已完成............
pool-1-thread-3完成.
pool-1-thread-2完成.
pool-1-thread-3完成.
pool-1-thread-2完成.
监听线程启动:当前有2个线程.用户输入了2个线程.
没有一个任务已完成............
pool-1-thread-2完成.
pool-1-thread-3完成.
pool-1-thread-3完成.
pool-1-thread-2完成.
监听线程启动:当前有2个线程.用户输入了5个线程.
添加了一个任务-------------------------
添加了一个任务-------------------------
添加了一个任务-------------------------
没有一个任务已完成............
pool-1-thread-3完成.
pool-1-thread-2完成.
pool-1-thread-1完成.
pool-1-thread-4完成.
pool-1-thread-5完成.
*/
}
可实时调整运行中的线程个数
最新推荐文章于 2022-01-14 14:25:51 发布