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

  • 相关阅读:
    Python正课15 —— 流程控制之while循环
    Python正课14 —— 深浅Copy
    Python正课13 —— 流程控制之if判断
    Python正课12 —— 成员运算 与 身份运算
    Python正课11 —— 逻辑运算
    Python正课10 —— 条件
    Python正课9 —— 可变不可变类型
    Python正课8 —— 运算符
    Python正课7 —— 与用户交互
    Python正课6 —— 垃圾回收机制
  • 原文地址:https://www.cnblogs.com/feixiangdecainiao/p/10747392.html
Copyright © 2011-2022 走看看