java 并发之Callable和Future

来源:互联网 发布:c语言中system 编辑:程序博客网 时间:2024/05/22 08:14

Callable和Future,一个产生结果,一个拿到结果。

(1)一个返回值 。

  方式1

package com.thread;import java.util.Random;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;public class CallableAndFuture {     public static void main(String[] args) {//实现 callable 接口Callable<Integer> callable = new Callable<Integer>() {@Overridepublic Integer call() throws Exception {// TODO Auto-generated method stubreturn new Random().nextInt(100);}};/* FutureTask 实现Future 和 Runnable 接口 * 实现FutureTask 用于接收Callable 返回的值 */         FutureTask<Integer> futureTask = new FutureTask<Integer>(callable);         new Thread(futureTask).start();                  try {Thread.sleep(5000);System.out.println(futureTask.get());} catch (ExecutionException e) {e.printStackTrace();}     catch (InterruptedException e) {e.printStackTrace();}}}
   方式2

package com.thread;import java.util.Random;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;public class ExecutorServiceAndFuture {     public static void main(String[] args) { ExecutorService executorService = Executors.newSingleThreadExecutor(); Future<Integer> future = executorService.submit(new Callable<Integer>() {@Overridepublic Integer call() throws Exception {// TODO Auto-generated method stubreturn new Random().nextInt(100);}}); try {Thread.sleep(5000);System.out.println(future.get());} catch (ExecutionException e) {e.printStackTrace();}     catch (InterruptedException e) {    e.printStackTrace();} }}

(2)执行多个带返回值的任务

 ExecutorService继承自Executor,它的目的是为我们管理Thread对象,从而简化并发编程,Executor使我们无需显示的去管理线程的生命周期,是JDK 5之后启动任务的首选方式。

package com.thread;import java.util.concurrent.Callable;import java.util.concurrent.CompletionService;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorCompletionService;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class ExcutorServiceAndCompletionService {     public static void main(String[] args) {           ExecutorService executorService =Executors.newCachedThreadPool();          CompletionService<Integer> cs = new ExecutorCompletionService<Integer>(executorService);          for(int i=0; i<5;i++){     final int taskID=i;    cs.submit(new Callable<Integer>() {@Overridepublic Integer call() throws Exception {return taskID;}});          }     for(int i=0;i<5;i++){     try {System.out.println(cs.take().get());} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}     }}}


0 0
原创粉丝点击