• 线程池的一些测试


    newFixedThreadPool

        问题提出:

    1.  jdk中关于newFixedThreadPool的叙述是创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。在任意点,在大多数 nThreads 线程会处于处理任务的活动状态。如果在所有线程处于活动状态时提交附加任务,则在有可用线程之前,附加任务将在队列中等待。如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务(如果需要)。在某个线程被显式地关闭之前,池中的线程将一直存在。
    2. 什么叫可重用固定线程的线程池?

        代码:

    1.  这个是我写的一个线程类,在打印完信息后睡眠个3秒钟
    1. public class MyThread extends Thread{
    2. private boolean flag;
    3. public MyThread(boolean flag) {
    4. this.flag = flag;
    5. }
    6. @Override
    7. public void run() {
    8. toString();
    9. try {
    10. Thread.sleep(3000);
    11. } catch (InterruptedException e) {
    12. e.printStackTrace();
    13. }
    14. System.out.println("The thread has recall !");
    15. }
    16. @Override
    17. public String toString(){
    18. System.out.println("NAME : " + this.getName() + " ID :" + this.getId());
    19. return null;
    20. }
    21. }
        2.    第二个程序,启动一个newFixedThreadPool运行一下。
        
    1. import java.util.ArrayList;
    2. import java.util.concurrent.ExecutorService;
    3. import java.util.concurrent.Executors;
    4. public class TestPoolExecutor {
    5. public static void main(String[] args) {
    6. ExecutorService pool = Executors.newFixedThreadPool(3);
    7. ArrayList<MyThread>threads = new ArrayList<MyThread>();
    8. boolean flag = true;
    9. for(int i=0; i<10; i++){
    10. MyThread thread = new MyThread(flag);
    11. threads.add(thread);
    12. pool.execute(thread);
    13. }
    14. }
    15. }

        3.    输出的情况
    1. NAME : Thread-0 ID :9
    2. NAME : Thread-1 ID :11
    3. NAME : Thread-2 ID :13
    4. The thread has recall !
    5. NAME : Thread-3 ID :15
    6. The thread has recall !
    7. NAME : Thread-4 ID :16
    8. The thread has recall !
    9. NAME : Thread-5 ID :17
    10. The thread has recall !
    11. NAME : Thread-6 ID :18
    12. The thread has recall !
    13. NAME : Thread-7 ID :19
    14. The thread has recall !
    15. NAME : Thread-8 ID :20
    16. The thread has recall !
    17. NAME : Thread-9 ID :21
    18. The thread has recall !
    19. The thread has recall !
    20. The thread has recall !

        结论:

    1.     可以看出,我启动了三个线程,在每个线程完成之后,又有一个新的线程进入线程池中,完成一些操作,之后在结束了该线程,重复添加线程,一直到所有的任务都完成为止!

    newCachedThreadPool

    1. newCachedThreadPool
    2. public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory)创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们,并在需要时使用提供的 ThreadFactory 创建新线程。
    3. 参数:
    4. threadFactory - 创建新线程时使用的工厂
    5. 返回:
    6. 新创建的线程池
    7. 抛出:
    8. NullPointerException - 如果 threadFactory null
       
    1.  ​这个是CachedThreadPool的说明和解释,可以看到,该线程池的空间是由jvm来自己定义的,也就是说,你可以启动n个线程,但是运行与否得看,jvm的内存和每一个线程的情况。
    2. 额,电脑测试光荣事迹,死机码
    1. import java.util.ArrayList;
    2. import java.util.concurrent.ExecutorService;
    3. import java.util.concurrent.Executors;
    4. public class TestPoolExecutor {
    5. public static void main(String[] args) {
    6. ExecutorService pool = Executors.newCachedThreadPool();
    7. ArrayList<MyThread>threads = new ArrayList<MyThread>();
    8. for(int i=0; i<2000000; i++){
    9. MyThread thread = new MyThread(i);
    10. threads.add(thread);
    11. pool.execute(thread);
    12. }
    13. }
    14. }
        3.    从这个可以得出一个深刻的结论:那就是让系统自行根据需求自行线程池不靠谱啊!

     





  • 相关阅读:
    [PHP] PHP 7.4.4错误修复版本的更改日志
    [Linux] 协程是不是我想的这样
    [前端] 代码中执行绑定元素的指定事件trigger方法
    [PHP] 中英双语网站的设计思路
    [网络] 使用wireshark抓包数据
    [MySQL] 有没有解决幻读问题
    [PHP] PDO 提供了三种不同的错误处理模式
    [Linux] 使用vmstat查看系统的负载情况
    [MySQL] innoDB引擎的主键与聚簇索引
    [PHP] 检测文件是否有病毒的实现逻辑
  • 原文地址:https://www.cnblogs.com/sober-reflection/p/4060658.html
Copyright © 2020-2023  润新知