java - 多线程的新手 - 多线程的最具成本效益的方法?

标签 java multithreading queue irc

<分区>

所以我在小型应用程序中使用了多线程。在这里创建一个新线程,在那里创建一个新线程。

我目前正在开发一个监控 IRC 聊天的程序。对于每个有效的命令,它都会创建一个线程,做一些工作,并将结果输出到聊天室。有时,应用程序会在短时间内获得 10 个或更多有效命令,并创建 10 个或更多线程。应用程序开始真正变慢。我读到创建和关闭线程的资源成本效率非常低,所以我想改变我的方法。

我的一个想法是创建一些线程(大约 5 个?),它们始终使用一种方法运行,我将命令传递给该方法,以 FIFO 为基础对它们进行排队。在我实现这个之前,我想看看是否有更好的东西我应该使用。当然,我不想跑掉重新发明轮子。

最佳答案

您可以使用固定尺寸 ExecutorService线程轮询。提交每条消息作为任务发送,它们将在有空闲线程时发送。例如

ExecutorService es = Executors.newFixedThreadPool(5);

注意:这可能会导致消息发送乱序,因此您的客户端应该能够根据时间戳重新排序消息。


顺便说一句:如果一次执行 10 个命令特别慢,则不是创建线程导致的。线程是昂贵的,但不是那么昂贵。相反,它很可能是网络延迟或其他一些阻塞操作。如果网络连接不佳,您可能需要为每个客户端创建 qa 队列。

关于java - 多线程的新手 - 多线程的最具成本效益的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14125022/

相关文章:

java - 如何在java中将 "hh mm a"格式字符串转换为秒

objective-c - 在主线程上执行带有多个参数的方法的最简单方法是什么?

java - 无法在线程中运行 wait() 方法?

c# - IronPython 作为 C# WPF VS 2015 的脚本语言

未完成任务的 Python 队列计数

c# - 如何实现我自己的高级生产者/消费者场景?

python - Python Asyncio队列获取未收到消息

java - 无法在图像上调用 getWidth()

java - 使用java中菜单栏的选项加载多个文件

java - 任意长度的相邻重复子串