• 多线程学习(二)


    如果希望在任务完成时返回一个值,那么可以实现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()将阻塞。直至结果准备就绪。

  • 相关阅读:
    [BZOJ1725][Usaco2006 Nov]Corn Fields牧场的安排
    [BZOJ1226][SDOI2009]学校食堂Dining
    [BZOJ2734][HNOI2012]集合选数
    [BZOJ4563][Haoi2016]放棋子
    [BZOJ4897][Thu Summer Camp2016]成绩单
    [BZOJ4896][Thu Summer Camp2016]补退选
    [POJ3155]Hard Life
    [BZOJ1486][HNOI2009]最小圈
    [BZOJ1690][Usaco2007 Dec]奶牛的旅行
    [BZOJ2144]跳跳棋
  • 原文地址:https://www.cnblogs.com/joeCqupt/p/6814112.html
Copyright © 2020-2023  润新知