我写了一个永远不会停止的测试应用程序。它发出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
/ notify
上Thread
对象,做为所内部完成。
这是一个很好的例子,说明为什么最佳实践是使用“私有”对象进行同步(和等待/通知)- 只有 您的代码才知道这一点。我通常使用类似:
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() 的线程。因此,假设两个线程称为等待同一对象。那么当我调用通知时,将通知哪个线程?