JAVA线程初学者,我有两个线程都在从1到20计数,一个线程打印甚至没有。其他线程正在打印奇数。一个接一个地使用Thread Inter通信(在同一个实例上使用wait和notify方法)同时使用奇数-1偶数2奇数3偶数4 ...奇数17甚至-18奇数19。
这部分执行得很好。但在计数结束时,任何一个线程都处于等待状态,其他线程正在终止。
那么如何摆脱这个问题呢?我应该用什么方法来摆脱这个问题呢?
代码:
public class OddEvenNumbers {
static A a= new A();
public static void main(String[] args) {
OddNumbers odd = new OddNumbers();
EvenNumbers even = new EvenNumbers();
Thread th1 = new Thread(odd);
Thread th2 = new Thread(even);
th1.start();
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
th2.start();
}
}
public class EvenNumbers implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=1;i<20;i++)
{
synchronized (OddEvenNumbers.a) {
if(i%2==0)
{
System.out.println("Even Numbers : "+i);
}
try {
OddEvenNumbers.a.notify();
OddEvenNumbers.a.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
public class OddNumbers implements Runnable {
public void run() {
System.out.println("In ODD run Method");
for(int i=1;i<20;i++)
{
synchronized (OddEvenNumbers.a) {
if(i%2!=0)
{
System.out.println("ODD Number "+i);
}
try {
OddEvenNumbers.a.wait();
OddEvenNumbers.a.notify();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
答案 0 :(得分:1)
删除最后一次wait()调用(当计数器等于20时),这样最后一个打印线程就不会等到没有机会获得notify()。