多线程学习(二)

如果希望在任务完成时返回一个值,那么可以实现callable接口

public class TaskWithResult implements Callable<String> {
	private int id;

	public TaskWithResult(int id) {
		super();
		this.id = id;
	}

	@Override
	public String call() throws Exception {
		// TODO Auto-generated method stub
		return "result of taskWithResult " + id;
	}

	public static void main(String[] args) {
		ArrayList<Future<String>> results = new ArrayList<>();
		// 运行方式一
		// 不使用Executor运行Future
		// for (int i = 0; i < 10; i++) {
		// FutureTask<String> futureTask = new FutureTask<>(new
		// TaskWithResult(i));
		// new Thread(futureTask).start();
		// results.add(futureTask);
		// }

		// 运行方式二  使用Executor.submit来提交callable任务 
		ExecutorService service = Executors.newCachedThreadPool();
		for (int i = 0; i < 10; i++) {
			results.add(service.submit(new TaskWithResult(i)));
		}

		for (Future<String> f : results) {
			try {
				System.out.println(f.get());
			} catch (InterruptedException | ExecutionException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} finally {
				service.shutdown();
			}
		}
	}
}

callable的运行会产生Future对象,可以使用isDone()方法来查询Future是否完成。当任务完成时,它具有一个结果,可以调用get()方法来获取这个结果。也可以不使用isDone()直接调用get(),这种情况下get()将阻塞。直至结果准备就绪。

posted @ 2017-05-05 17:30  风中小蘑菇  阅读(118)  评论(0编辑  收藏  举报