• 线程池工作原理


     

    1:处理Runnable 任务的方法

     

    1. package ThreadPooITest;
    2. import java.util.concurrent.*;
    3. //目标:线程池创建
    4. public class ThreadPoolTest {
    5. public static void main(String[] args) {
    6. //1:通过ThreadPoolExector
    7. ExecutorService pool= new ThreadPoolExecutor(3, 5, 8, TimeUnit.SECONDS,
    8. new ArrayBlockingQueue<>(4),Executors.defaultThreadFactory(),
    9. new ThreadPoolExecutor.CallerRunsPolicy());
    10. MyRunnble myRunnble = new MyRunnble();
    11. /* pool.execute(myRunnble);//线程池自动创建一个新的线程 。自动处理这个任务 自动执行
    12. pool.execute(myRunnble);//线程池自动创建一个新的线程 。自动处理这个任务 自动执行
    13. pool.execute(myRunnble);//线程池自动创建一个新的线程 。自动处理这个任务 自动执行
    14. pool.execute(myRunnble);//复用前面核心线程
    15. pool.execute(myRunnble);//复用前面核心线程
    16. */
    17. pool.execute(myRunnble);//线程池自动创建一个新的线程 。自动处理这个任务 自动执行
    18. pool.execute(myRunnble);//线程池自动创建一个新的线程 。自动处理这个任务 自动执行
    19. pool.execute(myRunnble);//线程池自动创建一个新的线程 。自动处理这个任务 自动执行
    20. pool.execute(myRunnble);
    21. pool.execute(myRunnble);
    22. pool.execute(myRunnble);
    23. pool.execute(myRunnble);
    24. //到了临时线程的创建时机了
    25. pool.execute(myRunnble);
    26. pool.execute(myRunnble);
    27. //看到新任务的拒绝的时机了
    28. pool.execute(myRunnble);
    29. // pool.shutdown();//等待线程都跑完再关闭线程池
    30. // pool.shutdownNow(); //立刻关闭线程池
    31. }
    32. }

    1. package ThreadPooITest;
    2. public class MyRunnble implements Runnable{
    3. @Override
    4. public void run() {
    5. System.out.println(Thread.currentThread().getName()+"==> 输出666~~");
    6. try {
    7. Thread.sleep(Integer.MAX_VALUE);
    8. } catch (InterruptedException e) {
    9. e.printStackTrace();
    10. }
    11. }
    12. }

    2:处理callable任务

    1. package ThreadPooITest;
    2. import java.util.concurrent.*;
    3. //目标:线程池创建
    4. public class ThreadPoolTest1 {
    5. public static void main(String[] args) throws Exception, InterruptedException {
    6. //1:通过ThreadPoolExector
    7. ExecutorService pool= new ThreadPoolExecutor(3, 5, 8, TimeUnit.SECONDS,
    8. new ArrayBlockingQueue<>(4),Executors.defaultThreadFactory(),
    9. new ThreadPoolExecutor.CallerRunsPolicy());
    10. Future f1= pool.submit(new MyCallable(100));
    11. Future f2= pool.submit(new MyCallable(200));
    12. Future f3= pool.submit(new MyCallable(300));
    13. Future f4= pool.submit(new MyCallable(400));
    14. // Future f5= pool.submit(new MyCallable(500));
    15. System.out.println(f1.get());
    16. System.out.println(f2.get());
    17. System.out.println(f3.get());
    18. System.out.println(f4.get());
    19. }
    20. }
    1. package ThreadPooITest;
    2. import java.util.concurrent.Callable;
    3. public class MyCallable implements Callable {
    4. private int n;
    5. public MyCallable(int n){
    6. this.n=n;
    7. }
    8. @Override
    9. public String call() throws Exception {
    10. int sum=0;
    11. for (int i=1;i<=n;i++){
    12. sum+=i;
    13. }
    14. return Thread.currentThread().getName() +"线程求1-"+n+"的和是:"+sum;
    15. }
    16. }

    3:Execcutois线程池的工具类

  • 相关阅读:
    文字转语音的软件哪个最好?分享几个宝藏软件给你们
    Lianwei 安全周报|2024.06.24
    【无标题】
    实验5:编写、调试具有多个段的程序
    一文了解 Go 标准库 strconv:string 与其他基本数据类型的转换
    字节跳动八进八出,offer到手,发现项目不重要算法才最重要
    nodejs+vue线上生活超市购物商城系统w2c42
    ssm小型超市管理系统的设计与实现毕业设计源码011136
    java常用下载官网
    07.用户和权限管理
  • 原文地址:https://blog.csdn.net/m0_46290090/article/details/133902364