创建线程的两种新方法 Callable & 线程池
1.实现Callable接口的方法 ---- JDK5.0之后新性能
可以支持泛型、call方法可以有返回值,可以抛异常
实现步骤:
1.创建类实现Callable接口,重写call方法
2.创建类的对象
3.创建FutureTask对象,并将步骤2的对象作为参数填入
4.创建线程,将FutureTask对象填入作为参数,调用start方法运行
5.可调用FutureTask对象get方法,获取call方法返回值
package Syn; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; /** * @author rook1e * @creat 2022/1/12 */ class MyThread implements Callable{ @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 CallableTest { public static void main(String[] args) { MyThread myThread = new MyThread(); FutureTask futureTask = new FutureTask(myThread); Thread thread = new Thread(futureTask); thread.start(); try { System.out.println(futureTask.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } }
2.线程池
package Syn; import java.util.concurrent.*; /** * @author rook1e * @creat 2022/1/16 */ class NumberTest implements Runnable{ @Override public void run() { for(int i = 0 ; i <= 100;i ++){ if(i % 2== 0){ System.out.println(Thread.currentThread().getName() + " " +i); } } } } class NumberCount implements Callable{ @Override public Object call() throws Exception { int sum = 0; for(int i = 0;i <= 100;i ++){ if(i % 2 == 1){ System.out.println(Thread.currentThread().getName() + " " + i); sum += i; } } return sum; } } public class ThreadPoolTest { public static void main(String[] args) { //创建固定数量的线程池 ExecutorService executorService = Executors.newFixedThreadPool(10); executorService.execute(new NumberTest());//适用Runnable FutureTask futureTask = new FutureTask(new NumberCount()); executorService.submit(futureTask);//适用callable try { System.out.println(futureTask.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } executorService.shutdown(); } }