Java 线程的交替运行范例

范例1:两个线程交替打印1-100之间的整数

package com.contoso;

public class MultiThreadPrinter {

    public static int intValue = 1;

    public static void main(String[] args) {

        Printer printer = new Printer();
        for (int i = 0; i < 2; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    while (intValue <= 100) {
                        printer.print(intValue++);
                    }
                }
            }).start();
        }

    }

    static class Printer {

        public void print(int intValue) {
            synchronized (this) {
                notify(); // 唤醒另一个线程
                System.out.println(Thread.currentThread().getName() + " " + intValue);
                try {
                    // 休眠200毫秒让打印效果更具备观赏性
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                 try {
                    wait(); // 释放掉锁
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
run:
Thread-0 1
Thread-1 2
Thread-0 3
Thread-1 4
Thread-0 5
Thread-1 6
Thread-0 7
Thread-1 8
Thread-0 9
Thread-1 10
Thread-0 11
Thread-1 12
Thread-0 13
Thread-1 14
Thread-0 15
Thread-1 16
Thread-0 17
Thread-1 18
Thread-0 19
Thread-1 20
Thread-0 21
Thread-1 22
Thread-0 23
Thread-1 24
Thread-0 25
Thread-1 26
Thread-0 27
Thread-1 28
Thread-0 29
Thread-1 30
Thread-0 31
Thread-1 32
Thread-0 33
Thread-1 34
Thread-0 35
Thread-1 36
Thread-0 37
Thread-1 38
Thread-0 39
Thread-1 40
Thread-0 41
Thread-1 42
Thread-0 43
Thread-1 44
Thread-0 45
Thread-1 46
Thread-0 47
Thread-1 48
Thread-0 49
Thread-1 50
Thread-0 51
Thread-1 52
Thread-0 53
Thread-1 54
Thread-0 55
Thread-1 56
Thread-0 57
Thread-1 58
Thread-0 59
Thread-1 60
Thread-0 61
Thread-1 62
Thread-0 63
Thread-1 64
Thread-0 65
Thread-1 66
Thread-0 67
Thread-1 68
Thread-0 69
Thread-1 70
Thread-0 71
Thread-1 72
Thread-0 73
Thread-1 74
Thread-0 75
Thread-1 76
Thread-0 77
Thread-1 78
Thread-0 79
Thread-1 80
Thread-0 81
Thread-1 82
Thread-0 83
Thread-1 84
Thread-0 85
Thread-1 86
Thread-0 87
Thread-1 88
Thread-0 89
Thread-1 90
Thread-0 91
Thread-1 92
Thread-0 93
Thread-1 94
Thread-0 95
Thread-1 96
Thread-0 97
Thread-1 98
Thread-0 99
Thread-1 100

范例2:两个线程交替打印1-100之间的整数,一个线程打印奇数,另外一个线程打印偶数

package com.contoso;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class MultiThreadPrinter {

    private static Lock lock = new ReentrantLock();
    private static Condition condition1 = lock.newCondition();
    private static Condition condition2 = lock.newCondition();

    public static void main(String[] args) {

        Thread t1 = new Thread(() -> {
            for (int i = 1; i <= 99; i += 2) {
                lock.lock();
                try {
                    condition2.signal();
                    System.out.println(Thread.currentThread().getName() + " " + i);
                    condition1.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    lock.unlock();
                }
            }
        });

        Thread t2 = new Thread(() -> {
            for (int i = 2; i <= 100; i += 2) {
                lock.lock();
                try {
                    condition1.signal();
                    System.out.println(Thread.currentThread().getName() + " " + i);
                    condition2.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    lock.unlock();
                }

            }
        });

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

范例3:两个线程交替打印1-100之间的整数,一个线程打印奇数,另外一个线程打印偶数

package com.contoso;

public class MultiThreadPrinter {

    private static Object obj = new Object();

    public static void main(String[] args) {

        Thread t1 = new Thread(() -> {
            for (int i = 1; i <= 99; i += 2) {
                synchronized (obj) {
                        System.out.println(Thread.currentThread().getName() + " " + i);
                        try {
                            Thread.sleep(200);
                            obj.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        obj.notify();                  
                }
            }
        });

        Thread t2 = new Thread(() -> {
            for (int i = 2; i <= 100; i += 2) {
                synchronized (obj) {
                        System.out.println(Thread.currentThread().getName() + " " + i);
                        obj.notify();
                        try {
                            Thread.sleep(200);
                            obj.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                }
            }
        });

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

范例4:3个线程交替打印1-100之间的整数

package com.contoso;

public class MultiThreadPrinter {

    private static volatile int i = 1;
    private static volatile int flag = 0;

    public static void main(String[] args) throws InterruptedException {
        new Thread(new Printer1()).start();
        new Thread(new Printer2()).start();
        new Thread(new Printer3()).start();
    }

    static class Printer1 implements Runnable {

        public void run() {
            while (i <= 100) {
                if (flag == 0) {
                    System.out.println(Thread.currentThread().getName() + " " + i);
                    i++;
                    flag = 1;
                }
            }
        }

    }

    static class Printer2 implements Runnable {

        public void run() {
            while (i <= 100) {
                if (flag == 1) {
                    System.out.println(Thread.currentThread().getName() + " " + i);
                    i++;
                    flag = 2;
                }
            }
        }

    }

    static class Printer3 implements Runnable {
        
        public void run() {
            while (i <= 100) {
                if (flag == 2) {
                    System.out.println(Thread.currentThread().getName() + " " + i);
                    i++;
                    flag = 0;
                }
            }
        }

    }

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

范例5:先让子线程执行3次,然后让主线程执行5次,如此往复10次

package com.contoso;
/**
 * 
 * 先让子线程执行3次,然后让主线程执行5次,如此往复10次
 */
public class MainApp {

    public static void main(String[] args) {

        Printer printer = new Printer();
        new Thread(new Runnable() {
            public void run() {
                // 子线程执行10次
                for (int i = 1; i <= 10; i++) {
                    printer.child(i);
                }
            }
        }
        ).start();
        // 主线程执行10次
        for (int i = 1; i <= 10; i++) {
            printer.main(i);
        }
        
    }
}

class Printer {

    private boolean isRunning = true;

    public synchronized void child(int i) {
        while (!isRunning) {
            try {
                this.wait();   //让子线程睡眠等待,并释放锁
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        for (int j = 1; j <= 3; j++) {
            System.out.println(Thread.currentThread().getName() + " " + j + " loop of " + i);
        }
        isRunning = false;
        this.notify(); // 唤醒主线程去执行
    }

    public synchronized void main(int i) {
        while (isRunning) {
            try {
                this.wait();  //让主线程睡眠等待,并释放锁
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        for (int j = 1; j <= 5; j++) {
            System.out.println(Thread.currentThread().getName() + " " + j + " loop of  " + i);
        }
        isRunning = true;
        this.notify(); // 唤醒子线程去执行
    }
}
run:
Thread-0 1 loop of 1
Thread-0 2 loop of 1
Thread-0 3 loop of 1
main 1 loop of  1
main 2 loop of  1
main 3 loop of  1
main 4 loop of  1
main 5 loop of  1
Thread-0 1 loop of 2
Thread-0 2 loop of 2
Thread-0 3 loop of 2
main 1 loop of  2
main 2 loop of  2
main 3 loop of  2
main 4 loop of  2
main 5 loop of  2
Thread-0 1 loop of 3
Thread-0 2 loop of 3
Thread-0 3 loop of 3
main 1 loop of  3
main 2 loop of  3
main 3 loop of  3
main 4 loop of  3
main 5 loop of  3
Thread-0 1 loop of 4
Thread-0 2 loop of 4
Thread-0 3 loop of 4
main 1 loop of  4
main 2 loop of  4
main 3 loop of  4
main 4 loop of  4
main 5 loop of  4
Thread-0 1 loop of 5
Thread-0 2 loop of 5
Thread-0 3 loop of 5
main 1 loop of  5
main 2 loop of  5
main 3 loop of  5
main 4 loop of  5
main 5 loop of  5
Thread-0 1 loop of 6
Thread-0 2 loop of 6
Thread-0 3 loop of 6
main 1 loop of  6
main 2 loop of  6
main 3 loop of  6
main 4 loop of  6
main 5 loop of  6
Thread-0 1 loop of 7
Thread-0 2 loop of 7
Thread-0 3 loop of 7
main 1 loop of  7
main 2 loop of  7
main 3 loop of  7
main 4 loop of  7
main 5 loop of  7
Thread-0 1 loop of 8
Thread-0 2 loop of 8
Thread-0 3 loop of 8
main 1 loop of  8
main 2 loop of  8
main 3 loop of  8
main 4 loop of  8
main 5 loop of  8
Thread-0 1 loop of 9
Thread-0 2 loop of 9
Thread-0 3 loop of 9
main 1 loop of  9
main 2 loop of  9
main 3 loop of  9
main 4 loop of  9
main 5 loop of  9
Thread-0 1 loop of 10
Thread-0 2 loop of 10
Thread-0 3 loop of 10
main 1 loop of  10
main 2 loop of  10
main 3 loop of  10
main 4 loop of  10
main 5 loop of  10
BUILD SUCCESSFUL (total time: 0 seconds)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值