java - 执行器线程池的使用

标签 java multithreading

我正在处理执行程序线程池,以检查是否有任何对象已插入到阻塞队列中。如果队列中有任何对象,一个线程从池中唤醒并从队列中取出对象,将其发送给某个类进行处理。

但我对使用如下所示的执行线程感到困惑。当我在 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/

相关文章:

multithreading - 使用 swank/slime 理解 Clojure 中的输出

c# - Parallel.ForEach 中的迭代器在多个线程上运行

Java 异常命名约定

java - 当 O(1) 与 O(log n) 无关紧要时,TreeSet 与 HashSet 对于小集合大小的速度

java - SWT 中漂亮图表的库?

c# - 一次多次调用相同的方法

c# - CreateLinkedTokenSource 抛出 ObjectDisposedException。如何正确安全地处置 CancellationTokenSource?

c++ - cpp中的pthread用于类中的不同成员函数

java - 单独线程中的实时消息处理方法体

java - 从 python 脚本设置环境变量