我正在尝试运行此代码,但是卡住了。我不想使用可运行的方法。只是想知道我在这里做错了。
package com.learning.threads;
public class OddThread extends Thread {
private Integer count;
Object lock;
public OddThread(Integer count,Object lock) {
this.count = count;
this.lock=lock;
}
@Override
public void run() {
while (count<1000) {
synchronized (lock) {
System.out.println("sdsd"+(count.intValue() % 2));
if ((count.intValue() % 2) == 0) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println("printing the odd number" + count);
count++;
lock.notify();
}
}
}
}
}
package com.learning.threads;
public class EvenThread extends Thread {
private Integer count;
Object lock;
public EvenThread(Integer count,Object lock){
this.count=count;
this.lock=lock;
}
public void run(){
while(count < 1000){
synchronized (lock) {
System.out.println((count.intValue()%2));
if((count.intValue()%2)!=0){
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
System.out.println("printing the even number"+ ++count);
lock.notify();
}
}
}
}
}
public class ThreadClass {
public static void main(String[] args) {
Integer count=new Integer(1);
Object lock=new Object();
EvenThread even=new EvenThread(count,lock);
OddThread odd=new OddThread(count,lock);
odd.start();
even.start();
}
答案 0 :(得分:0)
似乎是一种奇怪的方式。学校作业?
无论如何,所以我认为我知道您在尝试什么,但是使用通知来回切换,但是我认为它不会像您期望的那样工作。
您正在调用wait并通知该锁,但是您仍处于同步块中。一次只能在该块中有一个线程。您需要将其从该块中删除,然后尝试通知另一个人。这意味着需要重做一些代码以退出,然后在同步块之外尝试等待/通知代码。关于如何执行可能适合您的增量。