JAVA实现两个线程交易打印奇数偶数

JAVA实现两个线程交易打印奇数偶数

说明:这里通过 synchronizedwait() 以及 notify() 实现该功能。

所以,在写代码之前有必要简单了解一下 synchronizedwait() 以及 notify() 的作用。

  1. synchronized,这个相信大家都不陌生,synchronized锁,可以保证线程互斥的访问同步代码块,它是非公平锁,其原理是在JVM层面实现的,所以我们无法对其进行更改,例如将其由非公平锁改成公平锁。但是Lock锁是可以实现的,在构造函数里面可以指定。不多说了,不然就跑题了…
  2. wait(),该方法是Object类中的方法,也就是说所有的java类,都有这个方法。通过调用该方法,可以使得原本处于running状态的线程,放弃原来持有的锁,进入到blocking状态。因此,调用waiit()的前提是,线程必须已经持有了锁,没有持有锁的话,谈何释放锁。所以wait()方法必须在synchronized代码块内使用
  3. 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();
    }

}

输出内容如下:
JAVA实现两个线程交易打印奇数偶数_第1张图片
好了,到此结束。

你可能感兴趣的:(随笔)