Java进阶知识查漏补缺07
线程的实现方式三:实现Callable接口 --JDK5.0新增
package com.cjf.ThreadTest34; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; /** * Created with IntelliJ IDEA. * Description: * Author: Everything * Date: 2020-07-02 * Time: 15:37 */ //线程的实现方式三:实现Callable接口 --JDK5.0新增 //如何理解实现Callable接口的方式创建多线程比实现Runnable接口创建多线程方式强大? // 1. call() 可以有返回值的。 // 2. call()可以抛出异常,被外面的操作捕获,获取异常的信息 // 3. Callable是 支持泛型的 //1.实现Callable的类 class NumThread implements Callable{ //2.重写call方法 @Override public Object call() throws Exception { int sum = 0; for (int i = 1; i <= 100; i++) { if (i % 2==0){ System.out.println(i); sum += i; } } return sum; } } public class ThreadTest3 { public static void main(String[] args) { //3.实例化NumThread对象 NumThread numThread = new NumThread(); //4,将此numThread对象传递到FutureTask的构造器中 FutureTask futureTask = new FutureTask(numThread); //5.和runnable一样,当做对象参数传递到Thread构造器中,创建线程 Thread thread = new Thread(futureTask); thread.start(); //6.如果不想获取Callable的返回值,可以省略掉这一步 try { //get方法的返回值即为FutureTask构造器参数Callable实现类重写的call()的返回值。 Object sum = futureTask.get(); System.out.println("总和为:"+sum); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } }
第四种方法:线程池
package com.cjf.ThreadTest34; import java.util.concurrent.*; /** * Created with IntelliJ IDEA. * Description: * Author: Everything * Date: 2020-07-02 * Time: 15:57 */ //第四种方法:线程池 // 1.提高响应速度(减少了创建新线程的时间) // 2.降低资源消耗(重复利用线程池中线程,不需要每次都创建) // 3.便于线程管理 class NumberThread implements Runnable{ @Override public void run() { for (int i = 1; i <= 100; i++) { if (i % 2==0){ System.out.println(Thread.currentThread().getName()+":"+i); } } } } class NumberThread1 implements Callable{ @Override public Object call() throws Exception { for (int i = 1; i <= 100; i++) { if (i % 2!=0){ System.out.println(Thread.currentThread().getName()+":"+i); } } return null; } } public class ThreadTest4 { public static void main(String[] args) { //1.创建线程池,指定线程数量 ExecutorService Service = Executors.newFixedThreadPool(10); //2.将线程赋予对象 Service.execute(new NumberThread());//适用于Runnable //3.将线程赋予对象 NumberThread1 numberThread1 = new NumberThread1(); FutureTask futureTask = new FutureTask(numberThread1); Service.submit(futureTask);//适用于Callable //4.关闭线程池 Service.shutdown(); } }