zoukankan      html  css  js  c++  java
  • 关于线程轮流打印0-99

    使用Reentrantlock实现

    package com.wang;
    
    
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class Solution {
        public static int n=0;
        public static void main(String[] args) {
            ReentrantLock lock=new ReentrantLock();
            Condition conditionodd=lock.newCondition();
            Condition conditioneven=lock.newCondition();
            Thread threadeven = new Thread(()->{
                lock.lock();
                try{
                    while(n<100){
                        System.out.println(n++);
                        conditioneven.signalAll();
                        conditionodd.await();
                    }
    
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                   lock.unlock();
                }
            });
    
            Thread thread=new Thread(()->{
               lock.lock();
               try{
                   while(n<100){
                       System.out.println(n++);
                       conditionodd.signalAll();
                       conditioneven.await();
                   }
    
               }catch (Exception e){
                   e.printStackTrace();
               }finally {
                   lock.unlock();
               }
            });
            thread.start();
            threadeven.start();
        }
    }

    使用synchronized实现

    public class test {
        public static int n = 0;
        public static Object object = new Object();
        public static boolean even = true;
    
        public static void main(String[] args) {
            Thread threadeven = new Thread(() -> {
                synchronized (object) {
                    while (n < 100) {
                        if (even) {
                            System.out.println(n++);
                            even = false;
                            object.notify();
                        }
                        try {
                            object.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });
            Thread threadodd = new Thread(() -> {
                synchronized (object) {
                    while (n < 100) {
                        if (!even) {
                            System.out.println(n++);
                            even = true;
                            object.notify();
                        }
                        try {
                            object.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });
            threadeven.start();
            threadodd.start();
        }
    }

    注意:wait() await() 这些方法必须在同步代码块使用

  • 相关阅读:
    hi35183e增加exfat文件系统的支持(转)
    UDP 单播、广播和多播(转)
    linux系统中,kill -3查看java进程状态无效的解决方法
    js是用什么语言编写实现的
    云海天教程
    Docker下安装MySQL
    如何延长手机的使用寿命时间
    如何延长空调使用寿命?
    Linux 发送邮件
    Linux jstack命令
  • 原文地址:https://www.cnblogs.com/feixiangdecainiao/p/10747392.html
Copyright © 2011-2022 走看看