JAVA:线程池的应用示例

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Test {

	public static void main(String[] args) {
		// 获取当前电脑可用cpu数*2=可用线程数
		int poolSize = Runtime.getRuntime().availableProcessors() * 2;
		/*
		 * 设置队列最大长度,可选择的类为:
		 * ArrayBlockingQueue;
		 * LinkedBlockingQueue;
		 * SynchronousQueue;
		 * ArrayBlockingQueue和PriorityBlockingQueue使用较少,一般使用LinkedBlockingQueue和Synchronous。
		 * 线程池的排队策略与BlockingQueue有关。
		 */
		BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(10);
		/*
		 * 设置拒绝策略
		 * AbortPolicy	丢弃任务并抛出RejectedExecutionException异常
		 * DiscardPolicy	丢弃任务,但是不抛出异常
		 * DiscardOldestPolicy	丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
		 * CallerRunsPolicy	由调用线程处理该任务 
		 */
		RejectedExecutionHandler policy = new ThreadPoolExecutor.CallerRunsPolicy();
		/*
		 * 设置keepAliveTime的时间单位,有7种取值,在TimeUnit类中有7种静态属性:
		 * TimeUnit.DAYS;               //天
		 * TimeUnit.HOURS;             //小时
		 * TimeUnit.MINUTES;           //分钟
		 * TimeUnit.SECONDS;           //秒
		 * TimeUnit.MILLISECONDS;      //毫秒
		 * TimeUnit.MICROSECONDS;      //微妙
		 * TimeUnit.NANOSECONDS;       //纳秒
		 */
		TimeUnit unit = TimeUnit.SECONDS;
		/*
		 *创建es线程池
		 *参数1:int corePoolSize, // 线程池长期维持的线程数,即使线程处于Idle状态,也不会回收。
		 *参数2:int maximumPoolSize, // 线程数的上限
		 *参数3:long keepAliveTime, // 超过corePoolSize的线程的idle时长,超过这个时间,多余的线程会被回收。
		 *参数4:TimeUnit unit,// keepAliveTime的时间单位
		 *参数5:BlockingQueue<Runnable> workQueue, // 任务的排队队列
		 *参数6:ThreadFactory threadFactory, // 新线程的产生方式
		 *参数7:RejectedExecutionHandler handler) // 拒绝策略
		 */
		ExecutorService es = new ThreadPoolExecutor(poolSize, poolSize, 0, unit, queue, policy);
		/*
		 * 向线程池提交任务方法:
		 * execute(Runnable x) 没有返回值。可以执行任务,但无法判断任务是否成功完成。——实现Runnable接口
		 * submit(Callable x) 返回一个future。可以用这个future来判断任务是否成功完成。——实现Callable接口
		 * shutdown() 关闭线程池:按过去执行已提交任务的顺序发起一个有序的关闭,但是不接受新任务
		 * shutdownNow() 关闭线程池:尝试停止所有的活动执行任务、暂停等待任务的处理,并返回等待执行的任务列表
		 */
		for (int j = 0; j < 20; j++) {
			es.execute(new Runnable() {
				@Override
				public void run() {
					System.out.println("线程" + Thread.currentThread().getName());

				}
			});
		}
		es.shutdown();
	}
}

4核心cpu运行结果如下:
线程pool-1-thread-1
线程pool-1-thread-2
线程pool-1-thread-3
线程pool-1-thread-4
线程pool-1-thread-6
线程pool-1-thread-5
线程main
线程main
线程pool-1-thread-5
线程pool-1-thread-5
线程pool-1-thread-5
线程pool-1-thread-5
线程pool-1-thread-5
线程pool-1-thread-5
线程pool-1-thread-5
线程pool-1-thread-5
线程pool-1-thread-5
线程pool-1-thread-5
线程pool-1-thread-8
线程pool-1-thread-7

使用线程池工厂Executors创建线程池:
Executors.newCachedThreadPool(); //创建一个缓冲池,缓冲池容量大小为Integer.MAX_VALUE
Executors.newSingleThreadExecutor();//创建容量为1的缓冲池
Executors.newFixedThreadPool(int);//创建固定容量大小的缓冲池
示例:

ExecutorService es = Executors.newFixedThreadPool(8);
Future<String> future = es.submit(new Callable<String>() {
	@Override
	public String call() throws Exception {
		// TODO Auto-generated method stub
		return "返回";
	}
});
es.shutdown();
try {
	System.out.println(future.get());
} catch (InterruptedException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
} catch (ExecutionException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值