zoukankan      html  css  js  c++  java
  • Java多线程,线程交替执行

    两个线程,一个打印1-100的奇数,一个打印1-100的偶数;要求:线程1打印5个之后,线程2开始打印,线程2打印5个之后,线程1再开始打印,以此循环。

    Code:

    package com.qhong;
    
    
    public class Main {
        /*
           * 两个线程,一个打印1-100的奇数,一个打印1-100的偶数;要求:线程1打印5个之后,线程2开始打印,线程2打印5个之后,线程1再开始打印,以此循环。
           */
        private static int state = 1;
        private static int num1 = 1;
        private static int num2 = 2;
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            final Main t=new Main();
            new Thread(new Runnable(){
                @Override
                public void run(){
                    while(num1<100){
                        //两个线程都用t对象作为锁,保证每个交替期间只有一个线程在打印
                        synchronized(t){
                            // 如果state!=1, 说明此时尚未轮到线程1打印, 线程1将调用t的wait()方法, 直到下次被唤醒
                            if(state!=1){
                                try{
                                    t.wait();
                                }catch(InterruptedException e){
                                    e.printStackTrace();
                                }
                            }
                            // 当state=1时, 轮到线程1打印5次数字
                            for(int j=0;j<5;j++){
                                System.out.println(num1);
                                num1 +=2;
                            }
                            // 线程1打印完成后, 将state赋值为2, 表示接下来将轮到线程2打印
                            state = 2;
                            // notifyAll()方法唤醒在t上wait的线程2, 同时线程1将退出同步代码块, 释放t锁
                            t.notifyAll();
                        }
                    }
                }
            }).start();
    
            new Thread(new Runnable(){
                @Override
                public void run(){
                    while(num2<100){
                        synchronized(t){
                            if(state!=2){
                                try{
                                    t.wait();
                                }catch(InterruptedException e){
                                    e.printStackTrace();
                                }
                            }
    
                            for(int i=0;i<5;i++){
                                System.out.println(num2);
                                num2 +=2;
                            }
    
                            state=1;
                            t.notifyAll();
                        }
    
                    }
                }
            }).start();
        }
    }

    Output:

    1
    3
    5
    7
    9
    2
    4
    6
    8
    10
    11
    13
    15
    17
    19
    12
    14
    16
    18
    20
    21
    23
    25
    27
    29
    22
    24
    26
    28
    30
    31
    33
    35
    37
    39
    32
    34
    36
    38
    40
    41
    43
    45
    47
    49
    42
    44
    46
    48
    50
    51
    53
    55
    57
    59
    52
    54
    56
    58
    60
    61
    63
    65
    67
    69
    62
    64
    66
    68
    70
    71
    73
    75
    77
    79
    72
    74
    76
    78
    80
    81
    83
    85
    87
    89
    82
    84
    86
    88
    90
    91
    93
    95
    97
    99
    92
    94
    96
    98
    100
    View Code

    http://blog.csdn.net/junli_chen/article/details/49584187

  • 相关阅读:
    UI和3D物体的堆叠响应
    UI中的事件系统EventSystem
    UI的管理
    学习笔记--2020年12月30日
    Java集合框架
    Java基本数据类型
    数据存储
    intent和手势探测
    即时消息Toast和对话框
    Android事件处理的三种方法
  • 原文地址:https://www.cnblogs.com/hongdada/p/6870233.html
Copyright © 2011-2022 走看看