在我的应用程序中,我正在进行异步任务处理。为此我使用LinkedBlocking Queue。
客户端应用程序将在此队列中添加Task。为了阅读和处理任务,我创建了Listener类。 在我的Listener类的早期,在线程池的帮助下,我启动了100个线程,这些线程将继续读取和处理来自此队列的数据,因为请求负载会更高。但是这个系统的缺陷是100个线程将一直运行并从服务器启动时监听队列并且会占用CPU。
作为解决方案,使用线程池,我决定只创建2个线程来继续监听队列。将有一个单独的工作线程线程池,它将实际处理该任务。所以这两个监听器线程只会从队列中读取任务,并将移交给工作线程并继续监听。
例如:在服务器启动时,我将创建两个线程池。一个用于“监听线程”的大小为2,而对于工作线程大小为100。 2将在服务器启动时启动侦听线程,并且只要在队列中添加任何任务,任何一个侦听器线程都将从队列中获取任务,它将从工作线程池中获取一个线程并将移交任务进行处理。 目前我不知道如何在服务器启动时初始化工作线程池以及如何在需要时使用它的线程。
如果有人有任何想法,请帮助我。 我的听众课程:
public class TaskListener implements Runnable{
private int listenerThreadPoolSize = 2;
private int activeListenerThreads = 2;
private int WorkerThreadPoolSize = 100;
public void init(){
ExecutorService executor = Executors.newFixedThreadPool(listenerThreadPoolSize);
for(int i=1; i<=activeListenerThreads; i++){
executor.execute(new TaskListener());
}
TODO: initialise cache thread pool for worker thread
}
@Override
public void run() {
while(true){
System.out.println("Listening to queue");
try {
Thread.sleep(1000);
Task task = TaskHelper.INSTANCE.getTaskFromQueue();
System.out.println("processing task. Thread name: "+Thread.currentThread().getName());
TODO: get thread from worker threadpool and handover the task to worker thread
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}