zoukankan      html  css  js  c++  java
  • Java多线程--线程交替

    要求:
    借助同步机制,sleep()方法,join()方法,实现动画显示;
    甲线程:1、3、5、7、9
    乙线程:2、4、6、8、10
    丙线程:a、b、c、d、e
    main()线程输出:线程开始,线程结束

    输出结果:线程开始,1-a-2## 3-b-4## 5-c-6## …

    思考:
    使用多个判断标记,模拟(消费者-生产者)每线程输出一个后就等待,然后改变自己的标记
    临界资源–使用多个== putX() == 方法,判断属于自己的标记(== isEmptyX ==)然后输出
    使多个线程有序的交替执行
    代码:

    class Resource{
    private boolean isEmpty01 = true;
    private boolean isEmpty02 = false;
    private boolean isEmpty03 = false;

    //每个put方法对应一个输出,每输出一个就等待,等待其他人的唤醒
    public void put1(){
    while(!isEmpty01){
    try{
    wait();
    }catch(InterruptedException e){
    e.printStackTrace();
    }
    }
    //输出后
    isEmpty01 = false;
    isEmpty02 = true;
    notifyAll();
    }
    public void put2(){
    while(!isEmpty02){
    try{
    wait();
    }catch(InterruptedException e){
    e.printStackTrace();
    }
    }
    isEmpty02 = false;
    isEmpty03 = true;
    notifyAll();
    }
    public void put3(){
    while(!isEmpty03){
    try{
    wait();
    }catch(InterruptedException e){
    e.printStackTrace();
    }
    }
    isEmpty03 = false;
    isEmpty01 = true;
    notifyAll();
    }
    }

    class Player01 implements Runnable{

    private Resource res;
    private String[] arr;
    Player01(){}
    Player01(String[] arr,Resource res){
    this.arr = arr;
    this.res = res;
    }

    public void run(){
    synchronized(res){
    for(int i=0;i<arr.length;i++){
    //错误的点
    //61,62,这两句不能交换顺序
    res.put1();
    System.out.print(arr[i]+"-");
    try{
    Thread.sleep(1000);
    }catch(InterruptedException e){
    e.printStackTrace();
    }
    }
    }
    }
    }

    class Player02 implements Runnable{

    private Resource res;
    private String[] arr;
    Player02(){}
    Player02(String[] arr,Resource res){
    this.arr = arr;
    this.res = res;
    }

    public void run(){
    synchronized(res){
    for(int i=0;i<arr.length;i++){
    res.put2();
    System.out.print(arr[i]+"-");
    try{
    Thread.sleep(1000);
    }catch(InterruptedException e){
    e.printStackTrace();
    }
    }
    }
    }
    }

    class Player03 implements Runnable{

    private Resource res;
    private String[] arr;
    Player03(){}
    Player03(String[] arr,Resource res){
    this.arr = arr;
    this.res = res;
    }

    public void run(){
    synchronized(res){
    for(int i=0;i<arr.length;i++){
    res.put3();
    System.out.print(arr[i]+"## ");
    try{
    Thread.sleep(1000);
    }catch(InterruptedException e){
    e.printStackTrace();
    }
    }
    }
    }
    }

    class Test08{

    public static void main(String[] args){

    String[] arr1 = {"1","3","5","7","9"};
    String[] arr2 = {"a","b","c","d","e"};
    String[] arr3 = {"2","4","6","8","0"};

    Resource res = new Resource();

    Player01 p1 = new Player01(arr1,res);
    Player02 p2 = new Player02(arr2,res);
    Player03 p3 = new Player03(arr3,res);

    Thread t1 = new Thread(p1);
    Thread t2 = new Thread(p2);
    Thread t3 = new Thread(p3);

    t1.start();
    t2.start();
    t3.start();
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    执行结果:


    重要的是:
    这种利用标记可以实现超过2个线程的有序交替执行
    ---------------------

  • 相关阅读:
    mexHttpBinding协议 【发布元数据终结点】
    Revit API创建一个拷贝房间内对象布局命令
    Revit API判断是不是柱族模板
    Revit API封装一个通用函数“过名称找元素”
    Revit手工创建族
    Revit API根据参数类型取得参数的值
    Revit Family API 创建参考平面
    Revit Family API 添加参数与尺寸标注
    osgearth earth文件规范-符号参考
    Revit API创建几何实体Solid并找到与之相交的元素
  • 原文地址:https://www.cnblogs.com/ly570/p/10930949.html
Copyright © 2011-2022 走看看