Java 线程池 - Executors

1.newFixedThreadPool(int nThreads)

   创建一个固定大小,任务队列容量无界的线程池。线程池中核心线程数 = 最大线程数 = nThreads。加入线程池的线程处于托管状态,线程的运行不受加入顺序的影响。

package com.study.threadpool;

import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
 
public class ThreadPoolDemo {
	public static void main(String[] args) {		
		// 创建一个固定线程数的线程池
		ExecutorService pool = Executors.newFixedThreadPool(3);
		// 创建线程.将线程放入池中进行执行
		for(int i = 0; i < 5; i++) {
			pool.execute(new MyThread());
		}				
		// 关闭线程池
		pool.shutdown();
	}
}
 
class MyThread extends Thread {
	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName() + " 正在执行");
	}
}

执行结果:

pool-1-thread-2 正在执行
pool-1-thread-1 正在执行
pool-1-thread-3 正在执行
pool-1-thread-1 正在执行
pool-1-thread-2 正在执行

2.newSingleThreadExecutor()

   只有一个线程来执行无界任务队列的单一线程池。该线程池确保任务按照加入的顺序一个一个依次执行,任何时刻只有一个任务在执行。当唯一的线程因任务异常中止时,将创建一个新的线程来继续执行后续任务。单一线程池与newFixedThreadPool(1)的区别是:单一线程池的池大小是不能再改变的。

   改变上述代码中线程池创建方式:

ExecutorService pool = Executors.newSingleThreadExecutor();

   执行结果:

pool-1-thread-1 正在执行
pool-1-thread-1 正在执行
pool-1-thread-1 正在执行
pool-1-thread-1 正在执行
pool-1-thread-1 正在执行

3.newCachedThreadPool()

    创建一个大小无界的缓冲线程池。它的任务队列是一个同步队列。任务加入到池中,如果池中有空闲线程,则用空闲线程执行,如无则创建新线程执行。池中的线程空闲超过60s,将被销毁释放。池中的线程数随任务的多少变化。缓冲线程池适用于执行耗时较小的异步任务。池的核心线程数 = 0,最大线程数 = integer.MAX_VALUE。

    改变上述代码中线程池创建方式:

ExecutorService pool = Executors.newCachedThreadPool();

    执行结果:

pool-1-thread-1 正在执行
pool-1-thread-5 正在执行
pool-1-thread-2 正在执行
pool-1-thread-3 正在执行
pool-1-thread-4 正在执行

4.newScheduledThreadPool(int corePoolSize)

    能定时执行任务的线程池。该池的核心线程数由参数指定,最大线程数 =  integer.MAX_VALUE。

package com.study.threadpool;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
 
public class ThreadPoolDemo {
	public static void main(String[] args) {		
		// 创建一个固定线程数的线程池
		ScheduledExecutorService  pool = Executors.newScheduledThreadPool(2);
		//创建线程
		Thread t1 = new MyThread();
		Thread t2 = new MyThread();
		Thread t3 = new MyThread();
		// 将线程放入池中进行执行
		pool.execute(t1);
		// 使用延迟执行风格的方法
		pool.schedule(t2, 2, TimeUnit.SECONDS);
		pool.schedule(t3, 3, TimeUnit.SECONDS);		
		// 关闭线程池
		pool.shutdown();
	}
}
 
class MyThread extends Thread {
	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName() + " 正在执行");
	}
}

   执行结果

pool-1-thread-1 正在执行
pool-1-thread-2 正在执行
pool-1-thread-1 正在执行

5.newWorkStealingPool()

   以当前系统可用处理器数作为并行级别创建的work-stealing thread pool(ForkJoinPool)。

6.newWorkStealingPool(int parallelism)

    以parallelism指定的并行级别创建的work-stealing thread pool (ForkJoinPool)。

猜你喜欢

转载自blog.csdn.net/liyazhen2011/article/details/87912835