У меня есть два потока t0 и t1 с runnables, указанными ниже в разделе кода Run_0 и Run1 соответственно. то, что я хочу сделать, когда t0 пишет или выполняет свою задачу, которая длится 7 секунд, t1 должен ждать. и когда истечет 7 секунд, t1 должен быть уведомлен о продолжении работы. Я попытался сделать это с помощью wait() и notify(), но во время выполнения я ожидал, что t0 начнется, но на консоли отобразится только «T1 работает», а t0 ничего не печатает, как если бы оно не было начатоwait() не заставляет поток ждать?
, пожалуйста, позвольте мне знать, почему такое поведение происходит.
код:
public static void main(String[] args) {
t0 = new Thread(new Run_0());
t1 = new Thread(new Run_1());
t0.start();
t1.start();
}
private static class Run_0 implements Runnable {
public void run() {
// TODO Auto-generated method stub
while (true) {
long startTime = TimeUtils.getTSSec();
synchronized (t1) {
try {
t1.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("T0 is writing");
//simulate doing some work
while((TimeUtils.getTSSec()-startTime) <= 7) {
}
System.out.println("T0 finished writing");
synchronized (t1) {
t1.notify();
}
startTime = TimeUtils.getTSSec();
while((TimeUtils.getTSSec()-startTime) <= 7) {
}
}
}
}
private static class Run_1 implements Runnable {
public void run() {
// TODO Auto-generated method stub
while(true) {
System.out.println("T1 is working");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Возможно, вам стоит взглянуть на то, как использовать 'wait' и' notify' здесь сначала: http://www.qat.com/using-waitnotify-instead-thread-sleep-java/ – nidomiro
Или здесь, https : //docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html –