您的位置:首页 > 编程语言 > Java开发

java再复习-Future与Callable的使用

2017-03-11 14:16 246 查看
Future总是与Callable绑着使用的。

callable接口:相当于Runnable,但是被线程执行后可以提供返回值。

future接口:用来保存Callable的返回值的。

所以他俩是结合使用的

Future常用子类:

FutureTask,一个保存Callable接口返回值的任务,使用:

public class FutureAndCallableDemo {

public static void main(String[] args) throws Exception, ExecutionException {
FutureTask<String> futureTask = new FutureTask<>(new Callable<String>() {

@Override
public String call() throws Exception {
//执行耗时操作,在子线程中
Thread.sleep(2000);
return "json数据";
}
});

//开启线程去执行
new Thread(futureTask).start();
System.out.println("我还可以先干点其他事..");
System.out.println("拿到结果.." + futureTask.get());
}

}

另一种方式:
public class FutureAndCallableDemo {

public static void main(String[] args) throws Exception, ExecutionException {

Future<String> submit = Executors.newSingleThreadExecutor().submit(new Callable<String>() {

@Override
public String call() throws Exception {
Thread.sleep(2000);
return "数据";
}
});

System.out.println(submit.get());
}

}

几乎所有的线程池都可以submit callable接口对象,并且返回Future接口对象。
public class FutureAndCallableDemo {

public static void main(String[] args) throws Exception, ExecutionException {
//创建线程池
ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(10);
//使用CompletionService包装线程池,以便批量保存Callable返回结果
CompletionService<String> completionService = new ExecutorCompletionService<>(newFixedThreadPool);
for(int i=0;i<10;i++){
completionService.submit(new Callable<String>() {

@Override
public String call() throws Exception {
int random = new Random().nextInt(10000);
Thread.sleep(random);
System.out.println("返回数据..." + random);
return random + "";
}
});
}

for(int i=0;i<10;i++){
//取到Future对象有take和poll两个方法,take代表如果没有Future就阻塞等待,而poll代表如果此时没有,则直接返回Null
System.out.println("拿到数据..." + completionService.take().get());
}

newFixedThreadPool.shutdown();
}

}
执行结果:
返回数据...1617
拿到数据...1617
返回数据...4514
拿到数据...4514
返回数据...4791
拿到数据...4791
返回数据...5134
拿到数据...5134
返回数据...5766
拿到数据...5766
返回数据...6440
拿到数据...6440
返回数据...6824
拿到数据...6824
返回数据...7807
拿到数据...7807
返回数据...8624
拿到数据...8624
返回数据...9616
拿到数据...9616
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: