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个线程的有序交替执行
    ---------------------

  • 相关阅读:
    iOS-深入理解(转载)
    iOS开发
    夜光遥感
    希尔伯特曲线在地图图像分割中的应用
    希尔伯特曲线
    NLP生成论文
    MapGIS SDK(C++)【基础篇】
    从npm到vue和nodejs
    分形在遥感和GIS中的应用
    MapReduce、Hadoop、PostgreSQL、Spark
  • 原文地址:https://www.cnblogs.com/ly570/p/10930949.html
Copyright © 2011-2022 走看看