美文网首页
多线程(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