我正在处理执行程序线程池,以检查是否有任何对象已插入到阻塞队列中。如果队列中有任何对象,一个线程从池中唤醒并从队列中取出对象,将其发送给某个类进行处理。
但我对使用如下所示的执行线程感到困惑。当我在 for 循环中使用它们时,进程运行速度如我预期的那样快,但看起来有些不对劲。当我将执行程序从 for 循环中取出时,进程变慢了。这个逻辑对吗?
休息课
@RestController
public class FraudRestController {
@Autowired
private CoreApplication core;
//LOGIC HERE
....
core.addMesageToQueue(rbtran, type);
}
消息加入队列
public static void addMessageToQueue(TCPRequestMessage message) throws InterruptedException {
jobQueue.put(message);
}
核心类中监听队列的执行线程
ExecutorService consumers = Executors.newFixedThreadPool(THREAD_SIZE);
//Core Inits in here
@PostConstruct
public void init() {
//LOGIC
...
//<---THIS BLOCK----->
for (int i = 0; i < THREAD_SIZE; i++) { //<---- This For Loop
consumers.submit(() -> {
while (true)
sendMessageToServer();
});
}
//<---THIS BLOCK----->
}
发送消息函数
private void sendMessageToServer() throws Exception {
//LOGIC
...
if (host.isActive()) {
TCPRequestMessage message = jobQueue.take();
}
最佳答案
这将为您创建一个您传递的大小的线程池。
ExecutorService consumers = Executors.newFixedThreadPool(THREAD_SIZE);
这意味着现在有 THREAD_SIZE 个线程在等待队列。创建的这个队列是一个 LinkedBlockingQueue。该队列具有让线程在其为空或已满时等待的特性。
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
如果任务被提交到池中,此时如果队列已满,任务将不会被提交。在我们的例子中,因为我们没有提到大小,所以这里的大小是 Integer.MAX_VALUE
如果队列为空,池中的线程将等待任务插入队列。
当调用 ExecutorService 的提交方法时。
在内部,任务被提交到 LinkedBlockingQueue 的队列 boolean offer(E e);
中。
我相信基于此,您可以重新设计您正在实现的内容。
关于java - 执行器线程池的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53220858/