当前位置: 首页 > 面试题库 >

NetBeans / Java /新提示:Thread.sleep在循环中调用

干浩阔
2023-03-14
问题内容

在NetBeans中,有一个新提示: Thread.sleep在循环中调用。

问题1: 循环睡眠的时间/时间是什么时候?

问题2: 如果有问题,我该怎么办?

更新:问题3:
这是一些代码。在这种情况下,请告诉我是否应该在循环中使用其他方法代替Thread.Sleep。简而言之,它由侦听客户端TCP连接的服务器使用。如果达到与客户端的最大会话数,则在此处使用睡眠。在这种情况下,我希望应用程序等待一个空闲会话可用。

public class SessionManager {
    private static final int DEFAULT_PORT = 7500;
    private static final int SLEEP_TIME = 200;
    private final DatabaseManager database = new DatabaseManager();
    private final ServerSocket serverSocket = new ServerSocket(DEFAULT_PORT);

public SessionManager() throws IOException, SQLException
{
}

public void listen()
{
while (true)
    if (Session.getSessionCount() < Session.getMaxSessionCount())
        try
        {
             new Thread(new Session(database, serverSocket.accept())).start();
        }
        catch (IOException ex) { ex.printStackTrace(); }
    else
        try
        {
            Thread.sleep(SLEEP_TIME);
        }
        catch (InterruptedException ex) { ex.printStackTrace(); }
}

public static void main(String[] args) throws IOException, SQLException
{
new SessionManager().listen();
}
}

问题答案:

循环调用睡眠通常会导致性能下降。例如:

while (true) {
    if (stream.available() > 0) {
       // read input
    }
    sleep(MILLISECONDS);
}

如果MILLISECONDS太大,则此代码将花费很长时间才能意识到输入可用。

如果MILLISECONDS太小,则此代码将浪费大量系统资源,以检查尚未到达的输入。

sleep循环中的其他用途通常也很可疑。通常有更好的方法。

如果有问题,我该怎么办?

发布代码,也许我们可以给您一个明智的答案。

编辑

IMO,解决此问题的更好方法是使用ThreadPoolExecutor

像这样:

public void listen() {
    BlockingQueue queue = new SynchronousQueue();
    ThreadPoolExecutor executor = new ThreadPoolExecutor(
            1, Session.getMaxSessionCount(), 100, TimeUnit.SECONDS, queue);
    while (true) {
        try {
            queue.submit(new Session(database, serverSocket.accept()));
        } catch (IOException ex) { 
            ex.printStackTrace();
        }
    }
}

这会将执行程序配置为匹配您的代码当前的工作方式。您可以通过多种其他方式来做到这一点。请参阅上面的javadoc链接。



 类似资料:
  • 从我的main开始,我将启动两个线程,称为producer和consumer。两者都包含循环。生产者循环是UDP服务器,因此不需要Hibernate。我的问题出在消费者方面。使用者循环将对象从链接队列中移除,并将其传递给一个函数进行进一步处理。根据研究,在循环中使用线程Hibernate不是一个好的实践,因为有时O/S在设定时间结束时不会释放。如果我删除线程Hibernate,当应用程序是理想的,

  • 伙计们如何处理这样的代码和警告? 我已经尝试过许多,但它总是在单独的线程中运行,我需要暂停当前的线程。 请帮帮忙..

  • 我试图在Java中创建一个简单的动画,显示一个蓝色的球在一个500 x 500的窗口中水平移动。球应该以1px/30ms的速度移动。问题是,窗口只有在时循环退出时才被绘制,而不是在我想要的时循环的每次迭代中。这导致蓝色的球被绘制在它的最终位置。你能告诉我我在这里做错了什么吗?我也尝试过在EDT上使用绘画组件()方法执行这段代码,得到了同样的结果。此外,正如其他帖子所建议的,当使用EDT和绘画组件(

  • 问题内容: 在Java中,使用foreach循环遍历集合时,对集合调用remove是合法的吗?例如: 作为附录,删除尚未迭代的项是否合法?例如, 问题答案: 为了在迭代集合时安全地从集合中删除,你应该使用迭代器。 例如: 从Java文档: 此类的迭代器和方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时间以任何方式对列表进行结构修改,则除了通过迭代器自己的remove或add方法之外,迭代

  • 问题内容: 在Java中,我们不能与另一个具有相同名称的变量在同一作用域中声明一个变量: 语法错误,无法编译。但是,如果我们将其放入循环中: 不产生错误,效果很好。我们基本上是在声明相同的变量。是什么原因?在此背后我不知道/不了解的逻辑是什么? 问题答案: 考虑一下这种方式,在每个循环之后,作用域被“破坏”,变量消失了。在下一个循环中,将创建一个新的作用域,并且可以在该作用域中再次声明该变量。 由

  • 在以下示例中,有六个进程分别命名为P1,P2,P3,P4,P5和P6。 他们的到达时间和爆发时间如下表所示。 系统的时间量是4个单位。 进程ID 到达时间 突发时间 1 0 5 2 1 6 3 2 3 4 3 1 5 4 5 6 6 4 根据算法,我们必须保持就绪队列和甘特图。 两个数据结构的结构在每次调度后都会改变。 就绪队列: 最初,在时间,过程P1到达,其将被安排为时间片4单位。 因此,在就