线程池的一些测试

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.     从这个可以得出一个深刻的结论:那就是让系统自行根据需求自行线程池不靠谱啊!

 





转载于:https://www.cnblogs.com/sober-reflection/p/4060658.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值