JAVA实现两个线程交易打印奇数偶数
说明:这里通过 synchronized
和 wait()
以及 notify()
实现该功能。
所以,在写代码之前有必要简单了解一下 synchronized
和 wait()
以及 notify()
的作用。
synchronized
,这个相信大家都不陌生,synchronized
锁,可以保证线程互斥的访问同步代码块,它是非公平锁,其原理是在JVM层面实现的,所以我们无法对其进行更改,例如将其由非公平锁改成公平锁。但是Lock
锁是可以实现的,在构造函数里面可以指定。不多说了,不然就跑题了…wait()
,该方法是Object
类中的方法,也就是说所有的java类,都有这个方法。通过调用该方法,可以使得原本处于running
状态的线程,放弃
原来持有的锁
,进入到blocking
状态。因此,调用waiit()
的前提是,线程必须已经持有了锁,没有持有锁的话,谈何释放锁。所以wait()方法必须在synchronized代码块内使用
。notify()
,该方法也是Object
类中的方法。调用该方法会唤醒调用了wait()
的线程,但是只会随机唤醒其中一个调用了wait()
的线程,并让其继续执行下去。notify()方法同样必须在synchronized代码块内使用
。
上面有提到 wait()
notify()
都必须在synchronized
代码块内使用,具体原因请参考这里。
好了,简单的介绍就到这里了,接下来,让我们看看代码怎么实现吧,其实也很简单:
public class ThreadTest implements Runnable {
private static int i = 1;
//synchronized锁对象
private final Object o = new Object();
@Override
public void run() {
while (i <= 100) {
synchronized (o) {
System.out.println("我是" + Thread.currentThread().getName() + ",我打印出了" + i++);
//打印完成之后 唤醒另外一个线程
o.notify();
try {
//唤醒另外一个线程之后,调用wait() 释放synchronized锁 并进入blocking状态
//只有这样才能保证另外一个线程能获取到synchronized锁 并往下执行 实现交替打印
o.wait();
} catch (InterruptedException e) {
System.out.println("ERROR");
}
}
}
}
public static void main(String[] args) {
ThreadTest t = new ThreadTest();
Thread thread1 = new Thread(t, "线程1");
Thread thread2 = new Thread(t, "线程2");
thread1.start();
thread2.start();
}
}
输出内容如下:
好了,到此结束。