首页 > 解决方案 > 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);
        }
    }
}

它不是服务器代码,而是我用代码测试线程如何工作。当我启动无限线程(例如与我的服务器的许多连接)时,出现了一个问题,它卡住了,什么也没有发生。我虽然线程池正在阻止新任务,但在线程池有新线程的可用空间之前。有人可以告诉如何处理这样的事情吗?我试图减少最大值。线程,但它没有解决我的问题。我只想让线程池运行线程,无论有多少线程在等待。

标签: javamultithreadingthreadpoolexecutor

解决方案


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


推荐阅读