java - Java Threadpool 处理无限排队线程?
问题描述
我正在测试我的服务器,它有一个用于连接的线程池。
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。添加这么多任务后,主线程开始等待工作队列中的空间被清空。在您的线程池线程完成任何任务的执行并将任务从队列中删除后,空间变为可用并且主线程只有在队列中有任务空间时才能添加任务
推荐阅读
- javascript - 有谁知道有条件地路由到下一个页面、反应 js 或 js 的简单方法?
- r - observeEvent 由处理表达式中的事件触发,而不仅仅是 eventExpr 触发器
- javascript - 域 ip 地址的 websocket 连接失败
- python - 为什么 cv2.resize 转置请求的尺寸?
- java - 如何在通过 google docs API 创建文档时为 google docs 设置正文?
- python - 如何反转 numpy 转置
- excel - 使用输入框和消息框在excel VBA中搜索数据
- android - Flutter:从现有列表中填充 ListView.builder,每行 2 个小部件
- swift - 在 NSTextView 上设置插图
- ios - 如何使用计算着色器绘制大点云?