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

Java是否隐式通知等待线程?

叶茂
2023-03-14
问题内容

我写了一个永远不会停止的测试应用程序。它发出t.wait()t是一个Thread对象),但是我从不打电话通知。为什么此代码结束?尽管主线程在上同步t,但生成的线程仍在运行,因此不会锁定该对象。

public class ThreadWait {
    public static void main(String sArgs[]) throws InterruptedException {
        System.out.println("hello");
        Thread t = new MyThread();
        synchronized (t) {
            t.start();
            Thread.sleep(5000);
            t.wait();
            java.lang.System.out.println("main done");
        }
    }
}

class MyThread extends Thread {
    public void run() {
        for (int i = 1; i <= 5; i++) {
            java.lang.System.out.println("" + i);
            try {
                Thread.sleep(500);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }
}

结果是主线程等待5秒钟,在此期间工作人员提供其输出。然后,在5秒钟后,程序退出。t.wait()不等。如果主线程在5秒钟内没有进入睡眠状态(对此行进行了注释),则t.wait()实际上将等到工作人员完成操作。当然,join()这里是一种使用方法,但是,出乎意料的是,wait()它与做相同的事情join()。为什么?

也许JVM看到,由于仅运行一个线程,因此没有机会通知主线程并解决死锁。如果是这样,是否有文件记载的功能?

我正在Windows XP,Java 6上进行测试。


问题答案:

您正在等待Thread-,虽然大多数对象 都没有 隐式通知,Thread但线程终止时会通知一个对象。它记载的地方(我在寻找它…),你应该
使用wait/ notifyThread对象,做为所内部完成。

这是一个很好的例子,说明为什么最佳实践是使用“私有”对象进行同步(和等待/通知)- 只有 您的代码才知道这一点。我通常使用类似:

private final Object lock = new Object();

(不过,总的来说,如果可以的话,使用java.util.concurrent提供的一些更高层次的抽象会更干净。如注释中所述,实现Runnable而不是扩展Thread自己也是一个好主意。)



 类似资料:
  • 我想做一个小练习来习惯等待/通知。我想做的是简单地启动一个线程,然后用等待让它进入睡眠状态,用通知唤醒它,多次。 我的代码是: 我希望这会是这样 相反,这样做: 所以。。。通知似乎没有唤醒打印机线程? 这不应该是一个死锁,因为通过等待,我释放了所有的锁,所以主服务器不应该有任何对打印机的锁,打印机应该能够唤醒并打印。 我做错了什么?

  • 我有一段代码 如您所见,我首先将标志设置为false,这样其中一个线程就可以进入Sum2Elements方法并将其更改为true,从而让所有人都等待。 我知道在同步代码中,只有一个线程可以完成它的任务,这里我有两个同步方法,这是否意味着两个线程在每次通知之后都在尝试执行这个方法? 如果是这样,那么一个线程是否不可能输入Sum2Elements,在另一个线程进入InsertElement之前将标志更

  • 我不完全理解和()是如何工作的,因此我不得不将尝试缩减到以下代码部分。 main.java: runner.java: 当前,我在调用时得到一个非法MonitorStateException,但我不明白为什么。从我所看到的情况来看,我需要同步,但在这样做的时候,我假设它只会通知一个线程,而我的想法是通知所有线程。 我已经查看了,但是我找不到合适的替换(也许我只是遗漏了一些东西)。

  • 创建驱动程序时,我已将隐式等待设置为10秒。当我希望使用显式等待时,是否必须将隐式等待设置为0? 以下是一个示例: 我必须做webDriver.manage()。超时()。秒);还是没有必要?

  • 我如何用一个显式的替换这个隐式的等待呢? driver=新ChromeDriver(功能); driver.manage().DeleteAllCookies();

  • 我对通知方法的一点感到困惑。“notify() :它唤醒一个在同一对象上调用 wait() 的线程。因此,假设两个线程称为等待同一对象。那么当我调用通知时,将通知哪个线程?