可实时调整运行中的线程个数

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完成.
	 */
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值