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() 这些方法必须在同步代码块使用

  • 相关阅读:
    5. JVM虚拟机栈
    4. 程序计数器
    3. JVM运行时数据区
    2. 类加载
    1. JVM体系结构
    SpringCloud 网关组件Gateway
    SpringCloud Hystrix断路器的基本使用
    SpringCloud Ribbon和Feign 的使用和源码分析
    反向代理的概念
    事务mysql
  • 原文地址:https://www.cnblogs.com/feixiangdecainiao/p/10747392.html
Copyright © 2011-2022 走看看