3 通过 ExecutorService 和 Callable<Class> 实现有返回值的线程
我们需要在主线程中开启多个线程去执行一个任务,然后收集各个线程的返回结果并将最终结果进行汇总,这是就需要用到 Callable 接口。
具体步骤:
(1)创建一个类实现Callable接口
(2)重写 call() 方法
调用步骤:
(1)创建线程池
(2)创建接收结果的列表集合
(3)创建线程对象
(4)将线程对象提交到线程池中,并将返回结果接收
(5)将返回结果加入结果集合
(6)关闭线程池
//通过实现Callable接口来创建线程类 public class CThread implements Callable<String> { private String name; public CThread(String name ) { this.name = name; } //重写call()方法 @Override public String call() throws Exception { return name; } } /***********************************************************************/ //调用线程 //创建线程池 ExecutorService pool = Executors.newFixedThreadPool(5); //创建接收结果的列表集合 List<Future> list = new ArrayList<Future>(); for(int i = 0;i<5;i++) { //创建线程对象 Callable c = new CThread("线程"+i); //将线程对象提交到线程池中,并将返回结果接收 Future future = pool.submit(c); System.out.println("线程"+i+"已经加入线程池"); //将返回结果加入集合 list.add(future); } //关闭线程池 pool.shutdown(); //打印返回结果 for (Future future : list) { try { System.out.println(future.get().toString()); } catch (InterruptedException | ExecutionException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
4 基于线程池的execute(),创建临时线程
我们可以利用缓存策略使用线程池来创建线程
具体创建:
(1)创建线程池
(2)调用线程池的execute()方法
(3)采用匿名内部类的方法,创建Runnable对象,并重写run()方法
public class EThread { public static void main(String[] args) { //创建线程池 ExecutorService threadPool = Executors.newFixedThreadPool(10); for(int i = 0;i<10;i++) { //调用execute()方法创建线程 //采用匿名内部类的方法,创建Runnable对象,并重写run()方法 threadPool.execute(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()); } }); } } }