线程池

​ 线程池,其实就是一个容纳多个线程的容器,其中的线程可以反复使用,避免频繁创建线程对象和线程而消耗过多的资源。

使用

通常线程池都是通过线程池工厂创建,在调用线程池中的方法获取线程,执行任务方法

主要涉及的类和方法

Executors:线程池创建工厂类

ExecutorService:线程池类

主要用两个互为重载的方法,可以分别传入Callable和Runnable接口的子类,并开启线程,调用任务方法(不能直接放入继承Thread的类)

// 可获取返回值
<T> Future<T> submit(Callable<T> task);
// Thread类也是Runnable接口的子类
Future<?> submit(Runnable task);

实现Runnable接口方式

public class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println("拿到线程池中的线程");

        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("线程名称:" +Thread.currentThread().getName());
        System.out.println("完成任务,归还线程");
    }
}
public class MyTest1 {

    public static void main(String[] args) {
//        根据线程池工厂创建线程池并初始化线程数量
        ExecutorService service = Executors.newFixedThreadPool(2);
        MyRunnable runnable = new MyRunnable();

//        传入线程任务类,使用并开始线程池中的线程,如果开启数量大于线程池初始创建的数量
//        需要等待其他线程完成回到线程池中后再进行调用
        service.submit(runnable);
        service.submit(runnable);
        service.submit(runnable);

//        关闭连接
        service.shutdown();
    }
}

实现Callable接口的方式

public class MyCallable implements Callable<Integer> {

    private Integer num1;
    private Integer num2;

    public MyCallable(Integer num1, Integer num2) {
        this.num1 = num1;
        this.num2 = num2;
    }

    @Override
    public Integer call() throws Exception {
        System.out.println(Thread.currentThread().getName());
        return num1+num2;
    }
}
public class MyTest2 {

    public static void main(String[] args) throws ExecutionException, InterruptedException {

//        根据线程池工厂创建线程池并初始化线程数量
        ExecutorService service = Executors.newFixedThreadPool(2);
//        创建线程任务类
        MyCallable myCallable1 = new MyCallable(1,2);
        MyCallable myCallable2 = new MyCallable(5,2);
//        传入线程任务类,使用并开始线程池中的线程,
        Future<Integer> submit = service.submit(myCallable1);
        Future<Integer> submit1 = service.submit(myCallable2);
//        获取返回值
        System.out.println(submit.get());
        System.out.println(submit1.get());
        System.out.println(service);
        service.shutdown();
    }
}
// console
pool-1-thread-1
pool-1-thread-2
3
7
java.util.concurrent.ThreadPoolExecutor@29453f44[Running, pool size = 2, active threads = 0, queued tasks = 0, completed tasks = 2]

线程状态图

image-20200328235113533

Copyright © TaoQZ 2019 all right reserved,powered by Gitbook作者联系方式:taoqingzhou@gmail.com 修订时间: 2024-11-19 17:25:43

results matching ""

    No results matching ""

    results matching ""

      No results matching ""