Java 线程池并发编程详解
来源:互联网 发布:org.apache.http包 编辑:程序博客网 时间:2024/06/03 23:43
本博文分为6个部分:
1.BizProcessor:具体的事务处理逻辑,被多线程调用。
2.BizAsyncTaskCall:实现Callable接口,用于组装FutureTask。
3.BizFutureTask:代表一个异步计算任务,用于提交任务异步执行,并返回计算结果。
4.BizExecutor:包含一个ExecutorService,用于执行异步计算任务。
5.完整的测试程序。
6.测试程序运行结果。
一、BizProcessor
public class BizProcessor { public String bizProcess(String name){ return "Success, Congratulation to " + name; }}
二、BizAsyncTaskCall
public class BizAsyncTaskCall<V> implements Callable<String> { private BizProcessor bp; private String name; public BizAsyncTaskCall(BizProcessor bp, String name) { this.bp = bp; this.name = name; } @Override public String call() throws Exception { return bp.bizProcess(name); }}
三、BizFutureTask
public class BizFutureTask extends FutureTask<String> { private final CountDownLatch signal; public BizFutureTask(CountDownLatch signal, BizAsyncTaskCall<String> asyncTask){ super(asyncTask); this.signal = signal; } @Override protected void done(){ signal.countDown(); }}
四、BizExecutor
public class BizExecutor { private static final ThreadFactory THREAD_FACTORY = new ThreadFactory() { @Override public Thread newThread(Runnable r) { Thread t = new Thread(r); t.setDaemon(true); t.setName("[bizProcessor] " + t.getName()); return t; } }; private final ExecutorService executor; public BizExecutor(int minThreadNum, int maxThreadNum, int queueLength) { executor = new ThreadPoolExecutor( minThreadNum, maxThreadNum, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(queueLength), THREAD_FACTORY); } public void executeSafely(final FutureTask<String> task) { executor.execute(task); } public void shutdown() { List<Runnable> tasks = executor.shutdownNow(); if (!tasks.isEmpty()) { System.out.println("BizProcessor shuts down, leaving " + tasks.size() + " not executed"); } }}
五、BizMain
public class BizMain { public static void main(String[] args) { try{ //创建Executor BizExecutor bizExecutor = new BizExecutor(3, 5, 10); //创建signal,用于在任务完成后再获取结果 CountDownLatch signal = new CountDownLatch(4); //创建task并执行 List<BizFutureTask> bizFutureTaskList = new ArrayList<BizFutureTask>(); for(int i = 0; i < 4; i++){ BizFutureTask bizFutureTask = new BizFutureTask(signal, new BizAsyncTaskCall(new BizProcessor(), "ZQ-" + i)); bizFutureTaskList.add(bizFutureTask); bizExecutor.executeSafely(bizFutureTask); } //获取task执行结果 signal.await(1000, TimeUnit.MICROSECONDS); for(int i = 0; i < 4; i++){ System.out.println(bizFutureTaskList.get(i).get()); } }catch(Exception e){ e.printStackTrace(); } }}
六、测试结果
Success, Congratulation to ZQ-0Success, Congratulation to ZQ-1Success, Congratulation to ZQ-2Success, Congratulation to ZQ-3
0 0
- Java 线程池并发编程详解
- java并发编程—— 线程池原理 详解 ThreadPoolExecutor
- Java并发编程 11 Executor线程池详解
- java并发编程:线程池
- Java并发编程:线程池
- Java并发编程 线程池
- java并发编程---线程池
- Java并发编程:线程池
- Java并发编程:线程池
- 【Java并发编程】线程池
- java并发编程--线程池
- 并发编程 — 详解线程池
- 并发编程 — 详解线程池
- java并发编程-java线程池
- java并发编程--线程池初步
- java并发编程(6)--线程池
- Java并发编程:线程池的使用
- Java并发编程:线程池的使用
- 文本编辑器相关
- SMW0 HTML模版的形式上传文件 维护MIME类型
- 使用UIImagePickerController拍照和视频录制
- C/C++ 学习笔记:istringstream、ostringstream、stringstream 类介绍 和 stringstream类 clear函数的真正用途
- ajax
- Java 线程池并发编程详解
- 【Android】Android开发实现进度条效果,SeekBar的简单使用。音量,音乐播放进度,视频播放进度等
- 1130 N的阶乘的长度 V2(斯特林近似)
- UML中的四种关系
- Eclipse里的字体大小及编码问题
- REDIS 学习(8)并发导致的异常
- 零长数组(柔性数组)
- N-03. 内网接口设置 ❀ 网康 (NETENTSEC) 防火墙
- Sweet Butter_usaco3.2_spfa