美文网首页
多线程(9) — 线程池

多线程(9) — 线程池

作者: 烧杰 | 来源:发表于2018-04-17 22:25 被阅读0次

    线程池:将线程资源进行限制,比如FixedThreadPool(3)定义3个线程资源对线程进行管理,若多余3个则需要等其中一个完成才能进去开始任务。1.开启线程的消耗比较大,使用线程池相当于给了一个有n个线程的集合需要时直接拿,用完直接放回,大大减小了系统消耗。2.若线程中有线程发生阻塞,还能使用其他线程进行任务,而不至于都在等待排列。

    package ThreadPractice;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    /**
     * Created by qiaorenjie on 2018/3/28.
     */
    public class ThreadPoolTest {
    
        public static void main(String[] args) {
         //1.固定线程池
            ExecutorService threadPool = Executors.newFixedThreadPool(3);
            //2.缓存线程池 随线程数增加而增加,若减少则一段时间后会自动清理掉
    //        ExecutorService threadPool = Executors.newCachedThreadPool();
            //3.单个线程池 若线程消亡,会再开启一个,总是保证有一个线程
    //        ExecutorService threadPool = Executors.newSingleThreadExecutor();
            for (int i = 1; i <= 10; i++) {
                final int task = i;
                threadPool.execute(new Runnable() {
                    @Override
                    public void run() {
                        for (int j = 1; j <=10 ; j++) {
                            try {
                                Thread.sleep(20);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            System.out.println(Thread.currentThread().getName()+" 循环次数: "+j + " 任务数: "+ task);
                        }
                    }
                });
            }
            System.out.println("10个任务全部完成!");
           // threadPool.shutdown();
           // threadPool.shutdownNow();  // 不管是否执行完直接结束
          // 4. 定时线程池:用于定时启动
          Executors.newScheduledThreadPool(3).schedule(new Runnable() {
                @Override
                public void run() {
                    System.out.println("定时时间到!");
                }
            }, 10, TimeUnit.SECONDS);
    
        }
    }
    
    =====console=====
    .......
    pool-1-thread-2 循环次数: 8 任务数: 2
    pool-1-thread-1 循环次数: 8 任务数: 1
    pool-1-thread-3 循环次数: 8 任务数: 3
    pool-1-thread-2 循环次数: 9 任务数: 2
    pool-1-thread-1 循环次数: 9 任务数: 1
    pool-1-thread-3 循环次数: 9 任务数: 3
    pool-1-thread-2 循环次数: 10 任务数: 2
    pool-1-thread-1 循环次数: 10 任务数: 1
    pool-1-thread-3 循环次数: 10 任务数: 3
    pool-1-thread-2 循环次数: 1 任务数: 4
    pool-1-thread-1 循环次数: 1 任务数: 5
    pool-1-thread-3 循环次数: 1 任务数: 6
    .......
    

    可以看到在任务到10完成前只有3个任务数,当完成后才开放线程让第5个6个进来。。
    同时可以看到程序一直处于运行状态中:


    image.png

    因为线程池中总是有3个线程没有消亡,线程不消亡程序就一直会运行。可以调用shutdown()方法结束。

    几种不同的线程池比较:
    1.newFixedThreadPool(n): 表示固定数量n的线程池
    2.newCachedThreadPool(): 表示动态变化的线程池,与固定的不同,会随线程数增加而增加,若减少则一段时间后会自动清理掉。
    3.newSingleThreadExecutor(): 单个线程 若线程消亡,会再开启一个,总是保证有一个线程。可以利用此来实现 线程死掉后重新启动这一功能。(阻塞队列)
    4.newScheduledThreadPool(time): 表示启用一个定时任务多久之后启动。

    相关文章

      网友评论

          本文标题:多线程(9) — 线程池

          本文链接:https://www.haomeiwen.com/subject/eiaycftx.html