Java多线程Callable和Future类详解

匿名 (未验证) 提交于 2019-12-02 21:53:52

call 的方法

Future 表示异步计算的结果。计算完成后只能使用 get 方法来获取结果

1.线程处理返回结果

    一般开发中,使用多线程,最常见的就是:1.实现Runnable接口;2.继承Thread类。

    但是run方法是没有返回结果,很难满足我们的需求。这时,常用的办法就是实现Callable接口

    Callable接口提供了一个call方法入口,我们可以通过实现call方法,来执行任务;这个接口支持泛型,可以通过泛型参数,来获取想要的结果类型

  2.关闭线程池

    可以通过调用线程池的shutdown或shutdowNow方法来关闭线程池,但是它们的实现原理不同。

    shutdown的原理只是将线程池的状态设置SHUTDOWN状态,然后中断没有开始执行任务的线程。

    shutdownNow的原理是遍历线程池中的工作线程,然后逐个调用线程的interrupt方法来中断线程,所以需要注意一点,如果存在无法响应中断的任务,可能永远无法终止。shutdownNow会首先将线程池的状态设置成STOP,然后尝试停止所有的正在执行或暂停任务的线程,并返回等待执行任务的列表

package com.yyx.test;  import java.util.concurrent.Callable;  public class MyCallable implements Callable<String> {      private String name;      public MyCallable(String name) {         this.name = name;     }      @Override     public String call() throws Exception {         return name + "任务返回的内容";     }  }
package com.yyx.test;  import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future;  public class CallableFutureTest {     public static void main(String[] args) {         try {             // 创建一个线程池             ExecutorService pool=Executors.newCachedThreadPool();                          // 创建多个有返回值的任务             List<Future> listFuture=new ArrayList<Future>();             for(int i=1;i<=5;i++) {                 Callable c = new MyCallable("第"+i + "个线程");                 // 执行任务并获取Future对象                 Future f = pool.submit(c);                 //判断Future对象是否已经完成                 if (f.isDone()) {                     listFuture.add(f);                 }                             }                          // 关闭线程池             pool.shutdown();                           // 获取所有并发任务的运行结果             for (Future future : listFuture) {                 // 从Future对象上获取任务的返回值,并输出到控制台                 System.out.println(">>>" + future.get().toString());             }         } catch (Exception e) {             e.printStackTrace();         }             } }

原文:https://www.cnblogs.com/xianya/p/9219260.html

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!