wait、notify、notifyAll常见的面试问题
作者:互联网
用程序实现两个线程交替打印0~100的奇偶数
package threadobjectclasscommonmethods;
import jdk.nashorn.internal.ir.Block;
//描述 两个线程交替打印0~100的奇偶数,用synchronized关键字实现
public class WaitNotifyPrintOddEvenSyn {
private static int count;
private static Object lock = new Object();
//新建两个线程,一个处理偶数,一个处理奇数(位运算)
//用synchronized来执行
//偶数线程
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
while (count < 100) {
//加锁保证只有一个线程在运行,如果偶数线程抢到了多次锁也没有关系,
// 因为在count++后就是奇数,奇数时if语句就会判断时非,就不会进入sout语句,count就不会加一,依旧不会进行偶数线程的打印
synchronized (lock) {
//使用位运算提高效率,取出最后一位,是1就是奇数,是0就是偶数
if ((count & 1) == 0) {
System.out.println(Thread.currentThread().getName() + ":" + count++);
}
}
}
}
}, "偶数").start();
//奇数线程
new Thread(new Runnable() {
@Override
public void run() {
//控制在100以内数的循环
while (count < 100) {
synchronized (lock) {
//使用位运算提高效率,取出最后一位,是1就是奇数,是0就是偶数
if ((count & 1) == 1) {
System.out.println(Thread.currentThread().getName() + ":" + count++);
}
}
}
}
}, "奇数").start();
}
}
优化方法
package threadobjectclasscommonmethods;
//描述 两个线程交替打印0~100的奇偶数,用wait和notify
public class WaitNotifyPrintOddEveWait {
//1.拿到锁,我们就打印
//2.打印完,唤醒其他线程,自己就休眠
static class TurningRunner implements Runnable {
private static int count = 0;
private static Object lock = new Object();
public static void main(String[] args) throws InterruptedException {
new Thread(new TurningRunner(), "偶数").start();
new Thread(new TurningRunner(), "奇数").start();
}
@Override
public void run() {
while (count <= 100) {
synchronized (lock) {
System.out.println(Thread.currentThread().getName() + ":" + count++);
lock.notify();
if (count <= 100) {
try {
//如果任务没有结束,就让出当前的锁,并且自己休眠
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
}
标签:count,notifyAll,偶数,static,线程,notify,new,public,wait 来源: https://blog.csdn.net/qq_56572867/article/details/121574517