线程池ThreadPoolExecutor,Future

本文探讨了Java中线程池与阻塞队列的应用,重点介绍了如何使用Callable接口和Future来获取异步任务的返回结果。同时,通过PriorityBlockingQueue展示了如何实现任务的优先级调度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行任务的返回值。

MyThreadPoolExecutor myExecutor = new MyThreadPoolExecutor(3, 4, 1000, TimeUnit.MILLISECONDS, new LinkedBlockingDeque<Runnable>());
		List<Future<String>> results = new ArrayList<Future<String>>();
		for (int i = 0; i < 10; i++) { 
			SleepTwoSecTask task = new SleepTwoSecTask();
			Future<String> result = myExecutor.submit(task);
			results.add(result);
		}
		for (int i = 0; i < 5; i++) {
			try {
				String result = results.get(i).get();
				System.out.println("Result for Task:"+i+"==>"+result);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
SleepTwoSecTask继承了Callable<String>类,内部实现run()方法,返回一个String,输出为当前日期,Future<String> result里面放入run的返回值,String result = results.get(i).get();这里得到一个任务的返回值,打印如下:

Result for Task:0==>Wed Sep 17 15:24:41 GMT+0800 2014
Result for Task:1==>Wed Sep 17 15:24:41 GMT+0800 2014
Result for Task:2==>Wed Sep 17 15:24:41 GMT+0800 2014
Result for Task:3==>Wed Sep 17 15:24:43 GMT+0800 2014
Result for Task:4==>Wed Sep 17 15:24:43 GMT+0800 2014

阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。

上面一个例子为
LinkedBlockingQueue 是一个用链表实现的有界阻塞队列。此队列的默认和最大长度为Integer.MAX_VALUE。此队列按照先进先出的原则对元素进行排序。

下面看一个

PriorityBlockingQueue是一个支持优先级的无界队列。默认情况下元素采取自然顺序排列,也可以通过比较器comparator来指定元素的排序规则。元素按照升序排列。

看代码:
private void doExecute(){
		ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 3, 1, TimeUnit.SECONDS,new PriorityBlockingQueue<Runnable>());
		for (int i = 0; i < 10; i++) {
			MyPriorityTask task = new MyPriorityTask(i, "Task "+i);
			executor.execute(task);
		}
		
	}

这个线程池里面放的是PriorityBlockingQueue,因此他的任务需要实现Runnable, Comparable接口,内部实现
@Override
	public int compareTo(MyPriorityTask another) {
		if (this.priority < another.priority) {
			return -1;
		} else if (this.priority > another.priority) {
			return 1;
		} else {
			return 0;
		}
	}
这样任务就会按照优先级来执行,返回结果为:
MyPriorityTask:Task 0---Priority :0
MyPriorityTask:Task 1---Priority :1
MyPriorityTask:Task 2---Priority :2
MyPriorityTask:Task 3---Priority :3
MyPriorityTask:Task 4---Priority :4
MyPriorityTask:Task 5---Priority :5
MyPriorityTask:Task 6---Priority :6
MyPriorityTask:Task 7---Priority :7
MyPriorityTask:Task 8---Priority :8
MyPriorityTask:Task 9---Priority :9

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值