java线程同步问题,怎么交替输出

2025-06-27 23:51:24
推荐回答(2个)
回答1:

代码不写,提供你思路,用一个boolean值进行来回切换状态,这里的状态是说俩个进程中的状态,a线程生产完后就wait()方法等待,改变boolean值,然后b线程取商品,取完判断boolean,这时候由于a改过了可以进入条件,进入后notifyAll();然后b在wait();
你想保证来回切换不要用sleep();,用wait();这里说明下,sleep()是线程的一个静态方法,wait()和notifyAll()是Object的方法,sleep休眠时会继续占用锁,wait会释放锁
简单总结就是说一个进入等待,改个标识,另外一个在开始,查看标识,证明那个是等待呢,就唤醒它,然后自己进去等待。 在等待唤醒动作前都做完自己该做的,比如这里生产和消费。

回答2:

public class change implements Runnable {
private String sc, xf;
private int count;
private boolean flag = false;
private int i;//循环i次

public change(String a, String b,int i) {
sc = a;
xf = b;
this.i = i;

}

public void run() {
while(count changenumber();
}

public synchronized void changenumber() {
if (Thread.currentThread().getName().equals(sc)) {
try {
if (flag)
wait();
else if(count flag=true;
System.out.println(Thread.currentThread().getName()
+ ":生产者生产商品" + count);
notify();
Thread.sleep(1000);
}
} catch (Exception e) {
e.printStackTrace();
}
}

else if (Thread.currentThread().getName().equals(xf)) {
try {
if (flag&&count flag=false;
System.out.println(Thread.currentThread().getName()
+ ":消费者消费商品" +(count++));
notify();
Thread.sleep(1000);
} else
wait();
} catch (Exception e) {
e.printStackTrace();
}
}
}

public static void main(String args[]) {
String a = "生产者";
String b = "消费者";
change c = new change(a, b,10);
Thread scz = new Thread(c);
Thread xfz = new Thread(c);
scz.setName(a);
xfz.setName(b);
scz.start();
xfz.start();

}
}