一.题目:
.使用生产者和消费者模式实现,交替输出:
假设只要有两个线程,输出以下结果:
t1-->1
t2-->2
t1-->3
t2-->4
t1-->5
t2-->6
....
要求:必须交替,并且t1线程负责输出奇数,t2线程负责输出偶数。
两个线程共享一个数字,每个线程执行时都要对这个数字:++
二.完整代码:
package com.bjpowernode.javase10.Io.Homework.src.com.bjpowernode.javase6.Thread;
public class ThreadTest01 {
public static void main(String[] args) {
// 测试类
// 创建一个数字类对象,共享的
Num num=new Num();
// 生产者线程
Thread t1=new Thread(new Producer(num));
// 消费者线程
Thread t2=new Thread(new Customer(num));
// 设置程名字
t1.setName("t1是奇数");
t2.setName("t2是偶数");
// 开启线程
t1.start();
t2.start();
}
}
//定义一个数字类,共享仓库
class Num{
//初始化i的值
int i=1;
public Num(int i) {
this.i = i;
}
public Num() {
}
}
//生产者线程
class Producer implements Runnable{
//定义一个数字类过来
Num num;
public Producer(Num num) {
this.num=num;
}
@Override
public void run() {
// 用一个循环来测试
while (num.i<10) {
// 同步线程
synchronized (num) {
// 判断
if (num.i % 2 == 0) {//如果是偶数
// 进行等待
try {
num.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+"-->"+num.i++);
// 输出奇数
num.notifyAll();
}
}
}
}
//消费者线程
class Customer implements Runnable{
// 新建一个数字类过来
Num num;
public Customer (Num num) {
this.num=num;
}
@Override
public void run() {
// 用一个死循环来封装
while (num.i<10) {
// 同步线程
synchronized (num) {
// 判断
if (num.i % 2 != 0) {//如果是奇数
// 进行等待
try {
num.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+"-->"+num.i++);
// 输出偶数
num.notifyAll();
}
}
}
}