创建线程的两种新方法 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();
    }
}

 

posted @ 2022-01-16 14:30  Rook1e  阅读(165)  评论(0编辑  收藏  举报