要求:必须交替,并且t1线程负责输出奇数。t2线程负责输出偶数。 两个线程共享一个数字,每个线程执行时都要对这个数字进行:++
创建Number类,只有一个属性private int number
package Thread.Homework;
public class Number {
private int number;
public Number(int number) {
this.number = number;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
@Override
public String toString() {
return String.valueOf(number);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Number number1 = (Number) o;
return number == number1.number;
}
}
创建负责输出奇数的线程类
package Thread.Homework;
public class OddNumThread implements Runnable {
private Number number;
public OddNumThread(Number number) {
this.number = number;
}
@Override
public void run() {
//创建一个死循环
while (true) {
synchronized (number) {
if (number.getNumber() % 2 == 0) {//如果是偶数的话,就wait
try {
number.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
//程序能执行到这里说明现在的number是奇数
//所以++,将number变成偶数
System.out.println(Thread.currentThread().getName() + "--->" + number);
number.setNumber(number.getNumber() + 1);
number.notifyAll();
}
}
}
}
创建负责输出偶数的线程类
package Thread.Homework;
public class EvenNumThread implements Runnable {
private Number number;
public EvenNumThread(Number number) {
this.number = number;
}
@Override
public void run() {
//创建一个死循环
while (true) {
synchronized (number) {
if (number.getNumber() % 2 == 1) {//如果是奇数的话,就wait
try {
number.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
//程序能执行到这里说明现在的number是偶数
//所以++,将number变成奇数
System.out.println(Thread.currentThread().getName() + "--->" + number);
number.setNumber(number.getNumber() + 1);
number.notifyAll();
}
}
}
}
创建测试类测试程序
package Thread.Homework;
/*
使用生产者和消费者模式实现,交替输出:
假设只有两个线程,输出以下结果:
t1-->1
t2-->2
t1-->3
t2-->4
t1-->5
t2-->6
....
要求:必须交替,并且t1线程负责输出奇数。t2线程负责输出偶数。
两个线程共享一个数字,每个线程执行时都要对这个数字进行:++
public class Num {
int i;
}
synchronized(num){
if(num是奇数){
num.wait();
}
// 输出偶数
// notifyAll()
}
synchronized(num){
if(num是偶数){
num.wait();
}
// 输出奇数
// notifyAll();
}
*/
public class Test {
public static void main(String[] args) {
// 创建一个Number的Shared对象
Number number = new Number(1);
//创建两个线程
Thread t1 = new Thread(new OddNumThread(number));
Thread t2 = new Thread(new EvenNumThread(number));
//命名
t1.setName("t1");
t2.setName("t2");
//启动线程
t1.start();
t2.start();
}
}
结果展示