Java线程池处理无限的排队线程



im正在测试我的服务器,该服务器有一个用于连接的线程池。

public class Test
{
public static final void main(String[] args)
{
ThreadPoolExecutor threadPoolExecutorSentMessage = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(),
100,
5,
TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>());
ConnctionListener con = new ConnctionListener() //ignore this, included it for other usage.
{
public void onStartSendingMessages()
{
while(true)
{
for(int i = 0; i < 50; i++)
{
threadPoolExecutorSentMessage.execute(new TestT("Message: " + i));
}
}
}
};
con.onStartSendingMessages();
//new Thread(new MessageConnectionWaiter(con)).start();
}


private static class TestT implements Runnable
{
private String msg;
public TestT(String msg)
{
this.msg = msg;
}
@Override
public void run()
{
System.out.println(msg);
}
}
}

这不是服务器代码,而是我用代码测试线程的工作方式。当我启动无限线程(就像许多到服务器的连接一样(时,出现了一个问题,它被卡住了,什么也没发生。我认为在线程池为新线程提供可用空间之前,线程池正在阻止新任务。有人能告诉我如何处理这样的事情吗?我试图减少最大线程数,但它并没有解决我的问题。我只希望线程池运行线程,不管有多少线程在等待。

这不是导致问题的线程数。它是您要添加到工作队列中的任务数。您正在无限循环中添加任务。工作队列有一个容量,链接队列的最大容量为Integer.MAX_VALUE。在添加了那么多任务后,主线程开始等待工作队列中的空间被清空。在线程池线程完成任何任务的执行并从队列中删除该任务后,空间变为可用,并且只有在队列中有用于该任务的空间时,主线程才能添加该任务

最新更新