线程池基础
Posted yslu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程池基础相关的知识,希望对你有一定的参考价值。
package com.how2java.tmall.train.ThreadPool; import java.util.concurrent.*; import static java.util.concurrent.TimeUnit.NANOSECONDS; /** * @Author: yslu * @Date: 2019-09-30 8:44 * @description: */ public class ThreadPoolExecutorDemo { public static void main(String[] args) { /** * 1.FixedThreadPool 固定线程池方式启用线程 * 特点:最大线程数等于核心线程数,使用无界阻塞队列 * 可用于Web服务瞬时削峰,但需注意长时间持续高峰情况造成的队列阻塞。 */ ExecutorService executor2 = new ThreadPoolExecutor(5, 5, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>()); /** * 2.SingleThreadExecutor 单线程线程池 * 特点:最大线程数等于核心线程数等于1,使用无界阻塞队列 * 可用于系统在某个时间唯一执行的任务 */ ExecutorService executor3 = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>()); /** * 3.CachedThreadPool 缓存线程池 * 特点:最大线程数为Integer.MAX_VALUE,即无限大,keepAliveTime = 60s,线程空闲60s后自动结束并回收 * workQueue 为 SynchronousQueue 同步队列,这个队列类似于一个接力棒,入队出队必须同时传递, * 因为CachedThreadPool线程创建无限制,不会有队列等待,所以使用SynchronousQueue; * 快速处理大量耗时较短的任务,如Netty的NIO接受请求时,可使用CachedThreadPool。 */ ExecutorService executor4 = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); /** * 执行延时任务 */ ExecutorService executor = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 0, NANOSECONDS, new DelayQueue()); Executors.newScheduledThreadPool(5); for (int i = 0; i < 10; i++) { //创建WorkerThread对象(WorkerThread类实现了Runnable 接口) Runnable worker = new WorkerThread("" + i); //执行Runnable executor.execute(worker); } //终止线程池 executor.shutdown(); // while (!executor.isTerminated()) { // } System.out.println("Finished all threads"); } //创建一个FixedThreadPool对象 总共只有5个线程 // ExecutorService executor = Executors.newFixedThreadPool(5); }
package com.how2java.tmall.train.ThreadPool; import java.util.Date; /** * 线程执行 * @Author: yslu * @Date: 2019-09-30 8:43 * @description: */ public class WorkerThread implements Runnable { private String command; public WorkerThread(String s) { this.command = s; } @Override public void run() { System.out.println(Thread.currentThread().getName() + " Start. Time = " + new Date()); processCommand(); System.out.println(Thread.currentThread().getName() + " End. Time = " + new Date()); } private void processCommand() { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } @Override public String toString() { return this.command; } }
以上是关于线程池基础的主要内容,如果未能解决你的问题,请参考以下文章