Java的while循环和线程!

14

我有一个程序,不断地轮询数据库中某个字段的值是否发生变化。它在后台运行,目前使用while(true)和sleep()方法设置时间间隔。我想知道这是否是一种好的做法?还有,是否有更有效的实现方式?该程序需要始终运行。

因此,停止程序的唯一方法是对进程ID执行kill命令。该程序可能正在进行JDBC调用。如何更优雅地终止程序?我知道最好的选择是通过使用一个标志来设计一种退出策略,并定期检查线程。但是,我无法想到一种改变该标志值的方法/条件。有什么建议吗?

13个回答

0

我认为你应该使用TimerTask来轮询。

我的计算机在10秒内运行了1075566次while循环。这意味着每秒运行107557次。

真正需要多久才能进行轮询?TimerTask的最快运行速度是每秒1000次。您可以将int(毫秒)作为参数传递给它。如果您对此感到满意-这意味着您可以通过该任务减轻CPU的负担108倍。

如果您希望每秒轮询一次,那么就是(108 * 1000)。减轻负担108000倍。这也意味着您可以使用相同的CPU负荷检查108000个值 - 因为您不会经常分配CPU进行检查。请记住,CPU具有时钟周期。我的是3,600,000,000赫兹(每秒钟循环次数)。

如果您的目标是为用户更新数据,则可以在用户登录时运行检查(或手动让他请求更新)-这几乎不会对CPU造成任何负担。

您还可以使用thread.sleep(毫秒); 来降低轮询线程的负荷(因为它不会像以前那样频繁轮询)。


0

Java9 对此有另一个“潜在”的解决方案:Thread.onSpinWait():

表示调用者暂时无法前进,直到其他活动采取一项或多项行动。通过在自旋等待循环结构的每次迭代中调用此方法,调用线程向运行时指示它正在忙等待。运行时可能采取措施来提高调用自旋等待循环结构的性能。

有关更多详细信息,请参见JEP 285


0
我在我目前所在公司的实用程序库中创建了一个服务类来解决这些问题:
public class Service implements Runnable {

    private boolean shouldStop = false;

    public synchronized stop() {
        shouldStop = true;
        notify();
    }

    private synchronized shouldStop() {
        return shouldStop;
    }

    public void run() {
        setUp();
        while (!shouldStop()) {
            doStuff();
            sleep(60 * 1000);
        }
    }

    private synchronized sleep(long delay) {
        try {
            wait(delay);
        } catch (InterruptedException ie1) {
            /* ignore. */
        }
    }

}

当然这还远远不够完整,但你应该能理解要点。这将使您能够在需要程序停止时简单地调用stop()方法,并且它会干净地退出。


小注释 - 处理InterruptedException - 请参阅http://www-128.ibm.com/developerworks/java/library/j-jtp05236.html - noahlz
谢谢提供链接!很棒的文章! - Andrei Vajna II

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接