任何人都可以编写一个无限期运行的线程,而不需要像这样的昂贵的循环?
就像我不想要这样的东西
public void run() {
while(true)
{
do Blah Blah Blah
Thread.sleep(.....);
}
}
编写如此长时间运行的线程的任何优化方法。
提前致谢。
答案 0 :(得分:6)
我发现while (true) { ... }
是实现普通无限循环的最简洁方法。我认为没有更紧凑或更具成本效益的方法。
有些人更喜欢for (;;) { ... }
,但我觉得它看起来很尴尬。
就成本而言,javac
将两者编译为
public static void main(java.lang.String[]);
Code:
0: ...
...
...
goto 0
}
如果你确实希望循环是无限的,我看不到更有效的方法。
由于您的代码中有Thread.sleep
,我还建议您查看实例java.util.Timer
和java.util.TimerTask
。
如果您的循环尝试重复执行某些操作,那么从长远来看,您可能会浪费CPU时间。特别是如果您碰巧有这种类型的线程的许多实例。在这种情况下,我建议您查看观察者模式。让对象等待某事,监听到影响成功的可能性的对象。
答案 1 :(得分:1)
您认为while(true)
“代价高昂”的方式是什么?你有证据这会影响你的表现吗?您认为哪种操作比它便宜?
请注意:
我想这样一个无限的while循环会阻塞你的CPU。不是dat吗?所以我认为这很昂贵。
听起来你正在考虑整个循环,而不是while
部分。那么让我们来看看你在循环中做了什么:
do Blah Blah Blah
Thread.sleep(.....);
你明确告诉线程要睡觉了。在它休眠时,它不会消耗CPU资源。所以不,它不贵。不可否认,如果你的睡眠时间非常短而你的“做Blah Blah Blah”非常快,那么你的循环很多 - 但在这种情况下你应该考虑增加睡眠时间。 (您还应该考虑其他方法,允许您向线程发信号通知您希望它干净地退出,即使在它休眠时也这样做,而不必中断线程。)
您尚未向我们提供有关您真正想要实现的内容的任何信息,但从根本上来说,使用while
并不是问题。只要想想你想要循环的频率,以及它是否真的是一个简单的基于时间的价值。例如,如果这个线程是为了处理工作,那么你可能想要一些描述的生产者/消费者队列 - 线程在工作时不需要睡眠,但是没有必要让它唤醒< em>直到还有工作要做。当然,这只是一个例子 - 如果没有更多信息,我们真的无法提供更多建议。
答案 2 :(得分:1)
由于我们猜测你定义为成本,我想我会告诉你一些我能想到的成本。
线程通常有一些与之关联的堆栈内存。与许多应用程序(例如桌面/用户应用程序)的线程关联的堆栈内存量实际上不是问题。但是,假设您正在开发一个服务器,该服务器必须处理来自众多用户的长期连接。并且假设对于每个连接的用户,服务器必须重复执行相同的任务(就像你在while循环中可能做的那样)。使用每个连接/用户的线程来解决此解决方案可能变得非常昂贵。因此,代替在线程上阻塞/休眠,每当您获得事件时,从ThreadPool请求线程执行相同任务通常会更有效。这可以大大提高内存使用率。我认为只要有相对于可用内存量的大量线程,就可以考虑进行这样的优化。
可能不是你的情况,因为你说“无限期”,但这是我最近遇到的一个有趣的问题所以我认为我会喋喋不休。