zoukankan      html  css  js  c++  java
  • 用两个线程,一个输出字母,一个输出数字,交替输出1A2B3C4D...26Z

    ------------------------------第一种实现 LockSupport的park和unpark方法(**重要1**)---------------------------------------------------------------

    package com.example.demo.wxyDemo;

    import java.util.concurrent.locks.LockSupport;

    /**
    * 用两个线程,一个输出字母,一个输出数字,交替输出1A2B3C4D...26Z
    */
    public class ThreadOrderSwitch {
    static Thread t1=null, t2=null;

    public static void main(String[] args) {
    char[] aI = "123456789".toCharArray();
    char[] aC = "ABCDEFGHI".toCharArray();

    t1 = new Thread(()->{
    for(char c:aI){
    System.out.print(c);
    LockSupport.unpark(t2);
    LockSupport.park();
    }
    });

    t2 = new Thread(()->{
    for(char c:aC){
    LockSupport.park();
    System.out.print(c);
    LockSupport.unpark(t1);
    }
    });

    t1.start();
    t2.start();
    }
    }

    打印结果:1A2B3C4D5E6F7G8H9I
    LockSupport是一个线程阻塞工具类,所有的方法都是静态方法,可以让线程在任意位置阻塞,当然阻塞之后肯定得有唤醒的方法。
    为什么叫park呢,park英文意思为停车。我们如果把Thread看成一辆车的话,park就是让车停下,unpark就是让车启动然后跑起来。
    类似的还可以用类似自旋锁原理的volatile 和 AtomicInteger

    自旋锁示例:原地打转,占用cpu,不放弃cpu,(执行时间短快)不经过操作系统即内核态
    相对重量级锁:

    atomicInteger

    ===========================使用阻塞队列操作ArrayBlockingQueue======take()和put()方法阻塞======================

    
    
    ================================**重点2**使用sychnorized,wait,notify方法实现(重要)=====================================

    运行结果:1A2B3C...    或者A1B2C3...  (任一结果不确定)
    循环完了执行notify是为了停止线程,两个交替运行的话,总有一个是wait状态,导致线程无法停止,需要唤醒让线程执行完毕。
    想要输出想要的1A2B3C...,可以使用:
    (1)countDownLatch,让想要线运行的线程执行输出后latch.countDown(),后运行的线程执行latch.await()
    (2)======================**重点3**===============================
    使用可重用锁ReenTranLook的创建两个条件condition,(ReenTranLook.newCondition()),可精确的在哪种条件下通知哪些线程运行(重点)

    
    
  • 相关阅读:
    Qt QChart 中 QValueAxis 和 QCategoryAxis 区别
    Qt QChart 绘制面积图 QAreaSeries
    Qt QChart 设置线条样式 虚线
    Qt 读取csv文件并且绘制折线图
    Qt comboBox控件的三种基本用法
    Qt QStringList 的学习笔记
    OpenYurt 联手 eKuiper,解决 IoT 场景下边缘流数据处理难题
    如何避免 Go 命令行执行产生“孤儿”进程?
    阿里巴巴代码平台架构的演进之路
    云原生演进趋势下传统数据库升级实践
  • 原文地址:https://www.cnblogs.com/weixy3/p/12900428.html
Copyright © 2011-2022 走看看