package com.javase.wait和notify.homework; /* 使用生产者和消费者模式实现交替输出: 假设有两个线程,输出结果如下: t1--->1 t2--->2 t1--->3 t2--->4 t1--->5 t2--->6 ...... */ /* 分析: 1、两个线程交替执行 2、t1线程始终输出奇数,t2线程始终输出偶数 3、两个线程共享一个数字,每个线程执行都要对这个数字进行++ class Num { int i; } */ public class Homework { public static void main(String[] args) { // 创建一个数字(该数字两个线程共享) Num num = new Num(); // 创建两个线程(共享num) Thread t1 = new Thread(new Odd(num)); Thread t2 = new Thread(new Even(num)); // 改名 t1.setName("t1"); t2.setName("t2"); // 启动线程 t1.start(); t2.start(); } } //数字类 class Num { //属性(给定一个初始值1,因为从数字1开始,为此肯定奇数线程最先执行) int i = 1; } //奇数线程 class Odd implements Runnable{ //因为奇数线程与偶数线程同时共享数字类,为此将数字类对象作为奇数线程和偶数线程的属性 Num num; //有参构造方法 public Odd(Num num) { this.num = num; } //重写run()方法 @Override public void run() { //一直输出奇数 while (true){ synchronized (num){ //如果是偶数进入等待 if (num.i % 2 == 0){ try { num.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //程序运行到此说明是奇数开始输出 System.out.println(Thread.currentThread().getName() + "--->" + num.i); //数字输出后需要加1 num.i++; //程序到此延迟2秒(目的是每2秒输出1个数字,减缓程序运行速度) try { Thread.sleep(1000 * 2); } catch (InterruptedException e) { e.printStackTrace(); } //唤醒偶数线程 num.notify(); } } } } //偶数线程 class Even implements Runnable{ //因为奇数线程与偶数线程同时共享数字类,为此将数字类对象作为奇数线程和偶数线程的属性 Num num; //有参构造方法 public Even(Num num) { this.num = num; } //重写run()方法 @Override public void run() { //一直输出偶数 while (true){ synchronized (num){ //是奇数进入等待 if (num.i % 2 == 1){ try { num.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //程序运行到此说明是偶数开始输出 System.out.println(Thread.currentThread().getName() + "--->" + num.i); //输出后++ num.i++; //睡眠2秒(目的是每2秒输出1个数字,减缓程序运行速度) try { Thread.sleep(1000 * 2); } catch (InterruptedException e) { e.printStackTrace(); } //唤醒奇数线程 num.notify(); } } } }
使用生产者和消费者模式实现交替输出
于 2023-01-01 09:02:16 首次发布