JAVA Executor实现并发线程
来源:互联网 发布:学生党淘宝店铺白菜价 编辑:程序博客网 时间:2024/05/16 18:15
通过Executor来管理线程,包括了启动线程和关闭线程等。通过java.util.concurrent.ExecutorService
对象来启动线程并执行任务,因为java.util.concurrent.ExecutorService的execute方法参数类型是Runnable类的实例。比采用Thread的start()来启动线程会比较好。
1.Executor简单的实现线程:
- //线程数
- xecutorService threadPool=Executors.newFixedThreadPool(3);
- for (int i = 0; i < 20; i++) {
- Runnable runnable=new Runnable() {
- @Override
- public void run()
- {
- System.out.println("启动线程=="+Thread.currentThread().getName());
- }
- };
- //放进任务
- threadPool.execute(runnable);
- }
- 关闭启动线程
- threadPool.shutdown();
//线程数 ExecutorService threadPool=Executors.newFixedThreadPool(3); for (int i = 0; i < 20; i++) { Runnable runnable=new Runnable() {@Overridepublic void run() { System.out.println("启动线程=="+Thread.currentThread().getName());} }; //放进任务 threadPool.execute(runnable); }// 关闭启动线程 threadPool.shutdown();
ExecutorService executorService = Executors.newCachedThreadPool();
ExecutorService executorService = Executors.newFixedThreadPool(threadPoolNum);
ExecutorService executorService = Executors.newSingleThreadExecutor();
2).java.util.concurrent.ExecutorService的execute把任务添加到线程池里执行。
3).java.util.concurrent.ExecutorService的shutdown();关闭已经启动的线程。
2.我们要让线程执行针对的业务,好比如有好几个通道,一个线程对应一个通道,来发送相应的信息。
先把线程和通道对应起来,放在容器里,代码实现:
- threadPool=Executors.newFixedThreadPool(threadPoolNum, new ThreadFactory(){
- @Override
- public Thread newThread(Runnable r)
- {
- Thread thread=new Thread(r);
- Channel channel = connectManage.createChannel();//新建一个通道
- if(channel!=null)
- channelManager.put(thread, channel);//<span style="color: rgb(85, 85, 85); font-family: 'Times New Roman';font-size:18px; line-height: 28px; ">一个线程对应一个通道</span>
- return thread;
- }
- });
threadPool=Executors.newFixedThreadPool(threadPoolNum, new ThreadFactory(){@Overridepublic Thread newThread(Runnable r) {Thread thread=new Thread(r);Channel channel = connectManage.createChannel();//新建一个通道if(channel!=null)channelManager.put(thread, channel);//<span style="color: rgb(85, 85, 85); font-family: 'Times New Roman';font-size:18px; line-height: 28px; ">一个线程对应一个通道</span>return thread;}});执行线程并发送消息到相应的通道里。代码实现如下:
- Runnable runnable=new Runnable() {
- @Override
- public void run()
- {
- Thread thread=Thread.currentThread();//获取当前线程
- Channel channel=channelManager.get(thread);//取出线程对应的通道
- try {
- channel.basicPublish(msg.getExchange(),msg.getRouteKey(),MessageProperties. PERSISTENT_TEXT_PLAIN,msg.getSerialBytes());//发送消息
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- };
- threadPool.execute(runnable);//添加任务
Runnable runnable=new Runnable() {@Overridepublic void run() {Thread thread=Thread.currentThread();//获取当前线程Channel channel=channelManager.get(thread);//取出线程对应的通道try {channel.basicPublish(msg.getExchange(),msg.getRouteKey(),MessageProperties. PERSISTENT_TEXT_PLAIN,msg.getSerialBytes());//发送消息} catch (IOException e) {e.printStackTrace();}}};threadPool.execute(runnable);//添加任务
3.我们可以获取线程执行有结果是TRUE还是FALSE。具体实现:
- public class Taskimplements CompilationTask{
- /**
- * 设置处理器(用于注释处理)
- */
- @Override
- public void setProcessors(Iterable<?extends Processor> processors) {
- //
- }
- /**
- * 设置格式化诊断和其他本地化数据时要应用的语言环境
- */
- @Override
- public void setLocale(Locale locale) {
- }
- /**
- * 执行此编译任务。编译只能被执行一次
- */
- @Override
- public Boolean call() {
- System.out.println(Thread.currentThread().getName());
- return true;
- }
public class Task implements CompilationTask{/** * 设置处理器(用于注释处理) */@Overridepublic void setProcessors(Iterable<? extends Processor> processors) {// }/** * 设置格式化诊断和其他本地化数据时要应用的语言环境 */@Overridepublic void setLocale(Locale locale) {} /** * 执行此编译任务。编译只能被执行一次 */@Overridepublic Boolean call() {System.out.println(Thread.currentThread().getName());return true;}
- Future<Boolean> future=threadPool.submit(new Task());
- System.out.println(future.get());
- // 关闭启动线程
- threadPool.shutdown();
Future<Boolean> future=threadPool.submit(new Task()); System.out.println(future.get()); // 关闭启动线程 threadPool.shutdown();说明:
java.util.concurrent.ExecutorService的submit,参数类型是Runnable类型,实现具体的任务,然后这个任务执行是否成功,我们可以通过返回值进行判断,方便我们管理。
总结:
JAVA Executor实现并发线程,比采用Thread的start()来启动线程会比较好。
- JAVA Executor实现并发线程
- JAVA Executor实现并发线程
- Java Executor并发框架(十二)Executor框架线程池BlockingQueue的三种实现区别
- Java Executor并发框架(十四)Executor框架线程池使用原始方式实现生产者消费者模式
- Java并发---- Executor并发框架--线程池,ThreadToolExecutor初步理解
- Java并发---- Executor并发框架--线程池,ThreadToolExecutor初步理解
- Java并发编程之线程管理(Executor框架11)
- Java并发编程之线程管理(Executor框架12)
- Java并发编程之线程管理(Executor框架13)
- Java并发编程之线程管理(Executor框架14)
- Java并发编程之线程管理(Executor框架15)
- Java并发编程之线程管理(Executor框架16)
- Java并发编程-16-线程执行器-Executor Framework
- JAVA并发编程-Executor框架与线程池
- Java 并发 —— Thread、Executor、线程池
- Java并发编程 11 Executor线程池详解
- 【Java 并发】Executor框架机制与线程池配置使用
- 【Java】并发之Executor
- KMP算法详解
- PullToRefresh客户端和服务器端详解
- 中缀表达式转为后缀表达式 ---- 栈
- 在CentOS 7中安装Docker
- WM算法详解
- JAVA Executor实现并发线程
- dd备份系统和系统恢复
- 从JVM的角度看JAVA代码--代码优化
- android studio 第一天
- Android View 绘制流程 与invalidate 和postInvalidate 分析--从源码角度
- 软件测试的自我修养之学习自动化测试
- lua-文件操作
- 根据mac地址进行BLE连接
- LeetCode:House Robber II