如何避免使用Thread.Sleep

Der*_*rek 9 java multithreading sleep

在我下载最新版本的Netbeans之前,我从未想过使用Thread.Sleep.Netbeans现在警告你不要使用Thread.Sleep.所以我做了一些关于这个主题的研究,发现人们说你只需要使用Thread.Sleep进行调试/测试,如果你在任何时候使用它,那么你的代码编写得很糟糕.

所以我的问题是如何在以下情况下不使用Thread.Sleep.

我编写了一个与其他应用程序连接的服务器应用程序.服务器有两个线程:

  1. 处理来自套接字的数据并发回其他信息或仅发送简单的知识.

  2. 这是主线程.在开始套接字线程后,它将进入无限循环.在这个while循环中,我检查以确保套接字线程仍处于活动状态,并且用户没有要求通过TrayIcon接口退出应用程序.然后我睡觉并继续循环.

使用此应用程序,TrayIcon是唯一的UI.

这是我引用的片段:

// continues running as long as the exitth file is not present and 
// the tray icon is not in a safe to exit status.

while(doNotExit())
{

    if (getPrimaryThread() == null || !getPrimaryThread().isAlive())
        resetsThreadAndSocket();

    try
    {
        // check to see if the socket threads are still active, if not create new ones.
        if ((getPrimaryThread() == null || !getPrimaryThread().isAlive()))       
            createSocketThread();

        // check right before sleeping that the user does not want to exit.
        if(getTrayIcon().isExiting())
            break;

        // puts the main Thread to sleep for 3 seconds
           Thread.sleep(3000);
    }
    catch(SQLException ex)
    {
        _log.error(ex.getMessage(), ex);
        restartDatabase();
    }
}
Run Code Online (Sandbox Code Playgroud)

Aff*_*ffe 6

在大多数情况下,"首选"方法是使用ScheduledExecutorService内置的JavaSE来执行周期性任务,而不是每次使用while循环时自己重新实现它Thread.Sleep().

你的例子本身并没有什么不妥.从Java 5开始,这种语言现在拥有更强大的支持.


Dav*_*ave 3

而不是你的 Thread.sleep(3000) 做:

getPrimaryThread().join(3000)
Run Code Online (Sandbox Code Playgroud)

这将等待线程退出 3 秒。