Callable和Future

本文介绍如何利用Java中的ExecutorService、Callable和Future实现异步任务执行,包括如何提交任务、等待结果以及处理可能发生的异常。

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

  当一个任务运行完和希望其返回一些信息,可以使用Callable和Future.

ExecutorService threadPool = Executors.newFixedThreadPool(2);
		// 通过submit方法来提交一个Callable任务。
		// Future 是用来接受call方法返回的结果。
		Future<String> future = threadPool.submit(new Callable<String>() {

			@Override
			public String call() throws Exception {
				Thread.sleep(5000);
				return "hello hb";
			}

		});
		// 在main线程上等待结果
		System.out.println("等待结果:");
		try {
			// 通过get得到结果
			System.out.println("拿到结果:" + future.get());
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ExecutionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

还提交一组数据,由于线程的运行是不可知中,所以那个先运行完,我就拿那个的结果。相当于一个队列,先来行服务。

// 提交一组数据
		ExecutorService threadPool2 = Executors.newFixedThreadPool(13);
		CompletionService<Integer> completionService = new ExecutorCompletionService<Integer>(
				threadPool2);
		for (int i = 0; i < 10; i++) {
			final int task = i;
			Future<Integer> future2 = completionService
					.submit(new Callable<Integer>() {

						@Override
						public Integer call() throws Exception {
							Thread.sleep(1000);
							return task;
						}
					});

		}
		System.out.println("等待结果:");
		for (int i = 0; i < 10; i++) {
			try {
				System.out.println("拿到结果:" + completionService.take().get());
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ExecutionException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}


  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值