【发布时间】:2015-03-31 21:12:47
【问题描述】:
据我了解,当我希望当前线程停止工作直到另一个线程在同一个互斥对象上调用 notify() 时,我想在互斥锁上调用 wait()。这似乎不起作用。
我正在尝试制作线程打印 1-10。然后等待另一个线程打印 11-20。然后第一个线程将再次打印 21-30
Main.java
public class Main {
public static void main(String[] args) throws InterruptedException {
Object mutex = 1;
Thread child1 = new Thread(new Child1(mutex));
Thread child2 = new Thread(new Child2(mutex));
child1.start();
child2.start();
}
}
Child1.java
public class Child1 implements Runnable {
Object mutex;
public Child1(Object mutex){
this.mutex = mutex;
}
public void run() {
synchronized (mutex) {
for(int c = 0; c < 10; c++){
System.out.println(c+1);
}
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for(int c = 20; c < 31; c++){
System.out.println(c+1);
}
}
}
Child2.java
public class Child2 implements Runnable {
Object mutex;
public Child2(Object mutex) {
this.mutex = mutex;
}
public void run() {
synchronized (mutex) {
for (int c = 11; c < 21; c++) {
System.out.println(c);
}
notify();
}
}
}
输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17Exception in thread "Thread-0"
18
19
20
Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:502)
at task42.Child1.run(Child1.java:18)
at java.lang.Thread.run(Thread.java:745)
java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at task42.Child2.run(Child2.java:15)
at java.lang.Thread.run(Thread.java:745)
我错过了什么?
【问题讨论】:
-
@HovercraftFullOfEels,已添加输出。
-
你在叫什么等待和通知?不在互斥体上!您的代码在调用方法的当前对象上调用这些方法,即 Child1 和 Child2 的
this,而不是互斥体。 -
你是 wait() Child1 线程和 notify() Child2 线程。你必须在同一个线程上调用 wait() 和 notify()。
-
@BKBatchelor:您不会在线程上调用等待和通知(您可以,因为线程是一个对象-但是您不想),而是在一个物体上。
-
@HovercraftFullOfEels,谢谢!调用互斥体就可以了。
标签: java multithreading mutex