在这里插入代码片
第一次编写运行结果:数组从0到9,遍历到9后两个线程又从0开始,线程进入死循环
代码:
package Thread.ProduceAndCustomer.HomeWork;
/*利用生产者和消费者模式实现两个线程交替输出,且t1线程输出奇数,t2线程输出偶数*/
public class HomeWork {
public static void main(String[] args) {
int[] num = {0,1,2,3,4,5,6,7,8,9};
Thread t1 = new Thread(new MyThread1(num));
Thread t2 = new Thread(new MyThread2(num));
t1.setName("t1");
t2.setName("t2");
t1.start();
t2.start();
}
}
class MyThread1 extends Thread{
int[] number;
@Override
public void run() {
while (true){
synchronized (number) {
for (int i = 0; i < number.length; i++) {
if (number[i] % 2 == 0) {//偶数
System.out.println(Thread.currentThread().getName() + "--->" + number[i]);
try {
number.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
number.notifyAll();
}
}
}
}
//构造方法
public MyThread1(int[] number) {
this.number = number;
}
}
class MyThread2 extends Thread{
int[] number;
@Override
public void run() {
while (true){
synchronized (number) {
for (int i = 0; i < number.length; i++) {
if (number[i] % 2 != 0) {//奇数
System.out.println(Thread.currentThread().getName() + "--->" + number[i]);
try {
number.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
number.notifyAll();
}
}
}
}
//构造方法
public MyThread2(int[] number) {
this.number = number;
}
}
结果:
如图可知,我们需要达到的要求是间隔输出0-9即可,可是这里进入了死循环。
分析原因:在线程t1和线程t2的run方法中编写了while(true)循环,去掉结果既显示正确