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++){
返回数据...1617
拿到数据...1617
返回数据...4514
拿到数据...4514
返回数据...4791
拿到数据...4791
返回数据...5134
拿到数据...5134
返回数据...5766
拿到数据...5766
返回数据...6440
拿到数据...6440
返回数据...6824
拿到数据...6824
返回数据...7807
拿到数据...7807
返回数据...8624
拿到数据...8624
返回数据...9616
拿到数据...9616
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
相关文章推荐
- Java—Callable,Future的使用
- java中的Callable和Future的使用和困惑
- Java Callable Future 使用
- 浅谈在Java中使用Callable、Future进行并行编程
- java 使用Callable和Future返回线程执行的结果
- java线程:关于Callable和Future的简单使用:有返回值的线程
- Java Callable、Future的两种使用方式
- Java中的Runnable、Callable、Future、FutureTask的区别和CompletionService的使用场景
- Java多线程-Callable的Future返回值的使用
- JAVA多线程实现的三种方式(继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程)
- Java多线程研究06-带返回值的线程定义接口Callable以及Future,FutureTask的使用
- Java四种线程池的使用以及callable future整理
- Java 并发编程(八)Future和Callable,CompletionService的使用
- Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果
- java多线程学习笔记:使用Callable和Future
- Java.util.concurrent 包 使用Future,Callable实现抢答模式
- Android AsyncTask完全解析FutureTask 深度解析 -Java并发编程:Callable、Future和FutureTask一个使用DownloadManager下载文件的小例
- java多线程与并发之Callable和Future使用
- Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果
- Java并发编程之线程池、Callable和Future使用