Java 线程池处理无限排队的线程?
Java Threadpool handle unlimited queued threads?
我正在测试我的服务器,它有一个连接线程池。
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);
}
}
}
它不是服务器代码,而是我用代码测试线程是如何工作的。
当我开始无限线程时(就像我的服务器的许多连接),有一个问题,它卡住了,没有任何反应。我虽然线程池正在阻止新任务,但在线程池对新线程可用 space 之前。有人可以告诉如何处理这样的事情吗?我试图减少最大数量。线程,但它没有解决我的问题。我只希望线程池运行线程,无论有多少线程在等待。
这不是导致问题的线程数。它是您添加到工作队列的任务数。您正在无限循环中添加任务。并且工作队列有一个容量,链接队列的最大容量为Integer.MAX_VALUE。添加那么多任务后,主线程开始等待 space 在工作队列中清空。在您的线程池线程完成任何任务的执行并从队列中删除任务后,space 变得可用并且只有当队列中的任务有任何 space 时主线程才能添加任务
我正在测试我的服务器,它有一个连接线程池。
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);
}
}
}
它不是服务器代码,而是我用代码测试线程是如何工作的。 当我开始无限线程时(就像我的服务器的许多连接),有一个问题,它卡住了,没有任何反应。我虽然线程池正在阻止新任务,但在线程池对新线程可用 space 之前。有人可以告诉如何处理这样的事情吗?我试图减少最大数量。线程,但它没有解决我的问题。我只希望线程池运行线程,无论有多少线程在等待。
这不是导致问题的线程数。它是您添加到工作队列的任务数。您正在无限循环中添加任务。并且工作队列有一个容量,链接队列的最大容量为Integer.MAX_VALUE。添加那么多任务后,主线程开始等待 space 在工作队列中清空。在您的线程池线程完成任何任务的执行并从队列中删除任务后,space 变得可用并且只有当队列中的任务有任何 space 时主线程才能添加任务