private AtomicBoolean beginFlag = new AtomicBoolean(false);
private ArrayBlockingQueue<String> arrayBlockingQueue = new ArrayBlockingQueue<String>(100000);
private ExecutorService executor;
/**
* 1、简单任务示例(Bean模式)
*/
@XxlJob("demoJobHandler")
public ReturnT<String> demoJobHandler(String param) throws Exception {
String name = Thread.currentThread().getName();
log.info("当前线程名称:{}", name);
log.info("queue size:{}", arrayBlockingQueue.size());
try {
if (beginFlag.compareAndSet(false, true)) {
log.info("去准备线程池。。。");
startThreadPool();
} else {
log.info("添加任务。。。");
for (int i = 0; i < 5; i++) {
arrayBlockingQueue.add(UUID.randomUUID().toString());
}
}
} catch (Throwable e) {
log.error("error!", e);
}
return ReturnT.SUCCESS;
}
private void startThreadPool() {
executor = Executors.newFixedThreadPool(10);
for (int i = 0; i < 10; i++) {
Runnable runnable = new Runnable() {
@Override
public void run() {
while (true) {
try {
log.info("start task thread ");
String task = arrayBlockingQueue.take();
log.info("执行任务。。。。{}",task);
if (task == null) {
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
executor.execute(runnable);
}
}
使用while(true)的作用:
run方法中的代码就是线程要运行的代码,运行完毕以后,就不会再次运行,其方法本身并不是无限循环的。而while(true)是为了让run方法中的代码不断重复的运行,也就是让线程不停的运行,便于查看效果。如果去掉,run运行结束,线程也就结束了。
当然,while(true)并不是run()方法必须的,如果线程的run()部分只需要执行一次,则不需要嵌套while(true)循环。