通过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();
说明:
(1)通过java.util.concurrent.Executors实现线池程管理工具,有3种类型
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;
}
});
执行线程并发送消息到相应的通道里。代码实现如下:
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);//添加任务
3.我们可以获取线程执行有结果是TRUE还是FALSE。具体实现:
public class Task implements 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;
}
Future<Boolean> future=threadPool.submit(new Task());
System.out.println(future.get());
// 关闭启动线程
threadPool.shutdown();
说明:
java.util.concurrent.ExecutorService的submit,参数类型是Runnable类型,实现具体的任务,然后这个任务执行是否成功,我们可以通过返回值进行判断,
方便我们管理。
总结:
JAVA Executor实现并发线程,比采用Thread的start()来启动线程会比较好。
--转自