无限期线程优化

时间:2012-05-18 06:04:18

标签: java multithreading optimization

任何人都可以编写一个无限期运行的线程,而不需要像这样的昂贵的循环?

就像我不想要这样的东西

public void run() {

            while(true)
            {
                do Blah Blah Blah
                Thread.sleep(.....);

            }

        }

编写如此长时间运行的线程的任何优化方法。

提前致谢。

3 个答案:

答案 0 :(得分:6)

我发现while (true) { ... }是实现普通无限循环的最简洁方法。我认为没有更紧凑或更具成本效益的方法。

有些人更喜欢for (;;) { ... },但我觉得它看起来很尴尬。

就成本而言,javac将两者编译为

public static void main(java.lang.String[]);
  Code:
   0:  ...
       ...
       ...
       goto 0

}

如果你确实希望循环是无限的,我看不到更有效的方法。


由于您的代码中有Thread.sleep,我还建议您查看实例java.util.Timerjava.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请求线程执行相同任务通常会更有效。这可以大大提高内存使用率。我认为只要有相对于可用内存量的大量线程,就可以考虑进行这样的优化。

可能不是你的情况,因为你说“无限期”,但这是我最近遇到的一个有趣的问题所以我认为我会喋喋不休。