项目路径:
创建一个打印数字的对象,对象内有一个用于计数的成员变量,一个用于打印偶数的方法,一个用于打印奇数的方法.通过使用阻塞的方式来决定当前线程是否可以打印.
PrintNum.java
package com.beikai.springboottestdemo.writtentest.Thread;
/**
* @ClassName PrintNum
* @Description TODO
* @Author Admin
* @Date 2019/4/7 22:07
* @Version 1.0
**/
public class PrintNum{
private int num = 0;
/**
* 打印偶数
*/
public synchronized void printOdd(){
// 判断是否是奇数,如果是的话阻塞
while (num % 2 != 0){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 如果不是奇数,打印
System.out.println(Thread.currentThread().getName() + " : " + num);
num ++;
// 通知另一个线程
this.notify();
}
/**
* 打印奇数
*/
public synchronized void printEven(){
// 判断是否是奇数,如果不是,阻塞
while (num % 2 == 0){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 打印结果
System.out.println(Thread.currentThread().getName() + " : " + num);
num++;
// 通知其他线程
this.notify();
}
}
创建一个测试对象,对象声明打印数字的对象,分别创建两个线程,用于打印奇数和偶数,在方法中,先判断当前这个数是否是偶数或奇数,如果不是,使用wait()使线程阻塞,通知另一个线程可以打印了
PrintOddAndEven.java
package com.beikai.springboottestdemo.writtentest.Thread;
/**
* @ClassName PrintOddAndEven
* @Description TODO
* @Author Admin
* @Date 2019/4/7 22:06
* @Version 1.0
* 利用线程 一次奇偶数交替打印
**/
public class PrintOddAndEven {
public static void main(String[] args) {
// 声明一个打印对象
PrintNum printNum = new PrintNum();
// 创建两个线程
new Thread(new Runnable() {
@Override
public void run() {
Thread.currentThread().setName("打印偶数的线程 ");
while (true) {
printNum.printOdd();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
Thread.currentThread().setName("打印奇数的线程");
while (true) {
printNum.printEven();
}
}
}).start();
}
}