×

线程 线程池

《线程系列》二、线程池

我的笔记 我的笔记 发表于2020-11-24 19:13:14 浏览3907 评论0

抢沙发发表评论

1、线程池的体系结构:

2、工具类 Executors:

        //创建一个定长的线程池
        ExecutorService executorService = Executors.newFixedThreadPool(5);

        //创建一个可以缓存的线程池会回收线程,如果没有可回收,就创建
        ExecutorService executorService1 = Executors.newCachedThreadPool();

        //创建一个单线程的线程池
        ExecutorService executorService3 = Executors.newSingleThreadScheduledExecutor();

        //创建一个线程池,该线程池可以调度在给定延迟之后运行的命令,或者定期执行命令。
        ExecutorService executorService4 = Executors.newScheduledThreadPool(5);

模拟场景:

如果:

        核心线程:5

        最大线程:10

如果5个核心线程都在忙碌,还来任务就会放入队列中等待,如果还又源源不断的任务,就会创建新线程,过一段时间,会剔除非核心线程


3、使用线程池:

(1)、定长线程池使用

package com.fyd;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestThreadPool {
    public static void main(String[] args) {
        //创建线程池
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        //将线程交给线程池
        for (int i=0;i<10;i++){
            executorService.submit(new PoolRunnable());
        }
        //关闭
        executorService.shutdown();
    }

}
class PoolRunnable implements Runnable{
    @Override
    public void run() {
        for (int i=0;i<10;i++){
            System.out.println(i);
        }
    }
}

(2)、定长线程池使用

package com.fyd;

import java.util.concurrent.*;

public class TestThreadPool {
    public static void main(String[] args) {
        try {
            //创建线程池
            ExecutorService executorService = Executors.newFixedThreadPool(5);
            //将线程交给线程池
            for (int i = 0; i < 10; i++) {
                Future<Object> submit = executorService.submit(new Callable<Object>() {
                    @Override
                    public Object call() throws Exception {
                        int sum = 0;
                        for (int i = 0; i < 10; i++) {
                            sum += i;
                        }
                        return sum;
                    }
                });
                System.out.println(submit.get());
            }
            //关闭
            executorService.shutdown();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }

}

2、延迟运行线程池

package com.fyd;

import java.util.concurrent.*;

public class TestSchduledThreadPool {
    public static void main(String[] args) {
        try {
            ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);
            for (int i = 0; i < 10; i++) {
                ScheduledFuture<Integer> schedule = scheduledExecutorService.schedule(new Callable<Integer>() {
                    @Override
                    public Integer call() throws Exception {
                        int sum = 0;
                        for (int i = 0; i < 10; i++) {
                            sum += i;
                        }
                        return sum;
                    }
                }, 1, TimeUnit.SECONDS);
                System.out.println(schedule.get());
            }
            scheduledExecutorService.shutdown();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}



我的笔记博客版权我的笔记博客版权