<分区>
所以我在小型应用程序中使用了多线程。在这里创建一个新线程,在那里创建一个新线程。
我目前正在开发一个监控 IRC 聊天的程序。对于每个有效的命令,它都会创建一个线程,做一些工作,并将结果输出到聊天室。有时,应用程序会在短时间内获得 10 个或更多有效命令,并创建 10 个或更多线程。应用程序开始真正变慢。我读到创建和关闭线程的资源成本效率非常低,所以我想改变我的方法。
我的一个想法是创建一些线程(大约 5 个?),它们始终使用一种方法运行,我将命令传递给该方法,以 FIFO 为基础对它们进行排队。在我实现这个之前,我想看看是否有更好的东西我应该使用。当然,我不想跑掉重新发明轮子。
您可以使用固定尺寸 ExecutorService线程轮询。提交每条消息作为任务发送,它们将在有空闲线程时发送。例如
ExecutorService es = Executors.newFixedThreadPool(5);
注意:这可能会导致消息发送乱序,因此您的客户端应该能够根据时间戳重新排序消息。
顺便说一句:如果一次执行 10 个命令特别慢,则不是创建线程导致的。线程是昂贵的,但不是那么昂贵。相反,它很可能是网络延迟或其他一些阻塞操作。如果网络连接不佳,您可能需要为每个客户端创建 qa 队列。