两条线程分别打印奇偶数

两条线程分别打印奇偶数

Object的线程通信方式

以来Object对象提供的wait和notify,使多条线程在等到和唤醒之间切换,要注意下边界wait的边界条件,否则可能导致现在永远处于wait中而不结束

  //不一定需要volatile,因为已经sync保证了可见性
    public static int num = 0;
    private static Object lock = new Object();
    private static CountDownLatch countDownLatch = new CountDownLatch(2);

    public static void main(String[] args) throws InterruptedException {


        Thread ji = new Thread(new Runnable() {
            public void run() {
                while (num <= 100) {
                    synchronized (lock) {
                    	//这里的num还要在判断下,否则可能打出101
                        if (num % 2 != 0 && num <= 100) {
                            System.out.println("奇数打印:" + num);
                            num++;
                            lock.notifyAll();
                        } else {
                            try {
                                //这里要加条件进入wait,否则线程无法结束
                                if (num < 100) {
                                    lock.wait();
                                }
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }

                        }

                    }
                }
                countDownLatch.countDown();
            }
        });
        Thread ou = new Thread(new Runnable() {
            public void run() {
                while (num <= 100) {
                    synchronized (lock) {
                        if (num % 2 == 0) {
                            System.out.println("偶数打印:" + num);
                            num++;
                            lock.notifyAll();

                        } else {

                            try {
                                if (num < 100) {
                                    lock.wait();
                                }
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }

                        }
                    }

                }
                countDownLatch.countDown();
            }


        });
        ji.setName("jishu");
        ou.setName("oushu");
        ji.start();
        ou.start();
        countDownLatch.await();
    }

AtomicInteger方式

这种方式其实是将锁放在了aotmic中去进行了,实现方式简单明了,不需要多线程之间的状态转换,推荐使用

 
private static AtomicInteger num = new AtomicInteger(0);
    private static CountDownLatch countDownLatch = new CountDownLatch(2);

    public static void main(String[] args) throws InterruptedException {


        Thread ji = new Thread(new Runnable() {
            public void run() {
                while (num.intValue() < 100) {
                    if (num.intValue() % 2 != 0 ) {
                        System.out.println("奇数打印:" + num);
                        num.incrementAndGet();
                    }
                }
                countDownLatch.countDown();

            }

        });
        Thread ou = new Thread(new Runnable() {
            public void run() {
                while (num.intValue() <= 100) {
                    if (num.intValue() % 2 == 0) {
                        System.out.println("偶数打印:" + num);
                        num.incrementAndGet();

                    }
                }
                countDownLatch.countDown();
            }

        });
        ji.setName("jishu");
        ou.setName("oushu");
        ji.start();
        ou.start();
        countDownLatch.await();
    }

猜你喜欢

转载自blog.csdn.net/jerryJavaCoding/article/details/82976799