博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【多线程】双线程交替打印1至100
阅读量:4094 次
发布时间:2019-05-25

本文共 4776 字,大约阅读时间需要 15 分钟。

一、内置锁

  • 同步:synchronized
  • 协作:Object # wait/notify/notifyAll
public class PrintNumber {    /**     * 打印锁,同一时刻仅有一个任务可以持有此锁     */    private static Object lock = new Object();    /**     * 计数器     */    private static int counter = 1;    /**     * 计数器最大值     */    private static final int MAX_COUNTER = 100;    public static void main(String args[]) {        // 奇数打印线程        Thread oddThread = new Thread() {            @Override            public void run() {                // 请求打印锁                synchronized (lock) {                    while (counter <= MAX_COUNTER) {                        // counter为奇数,打印counter并唤醒偶数打印线程                        if (counter % 2 != 0) {                            System.out.println("Thread1 : " + counter);                            counter = counter + 1;                            lock.notifyAll();                        }                        // counter为偶数,挂起并等待偶数打印线程唤醒                        else {                            try {                                lock.wait();                            } catch (Exception e) {                                e.printStackTrace();                            }                        }                    }                }            }        };        // 偶数打印线程        Thread evenThread = new Thread() {            @Override            public void run() {                // 请求打印锁                synchronized (lock) {                    while (counter <= MAX_COUNTER) {                        // counter为偶数,打印counter并唤醒奇数打印线程                        if (counter % 2 == 0) {                            System.out.println("Thread2 : " + counter);                            counter = counter + 1;                            lock.notifyAll();                        }                        // counter为奇数,挂起并等待奇数打印线程唤醒                        else {                            try {                                lock.wait();                            } catch (Exception e) {                                e.printStackTrace();                            }                        }                    }                }            }        };        oddThread.start();        evenThread.start();    }}

二、显式锁

  • 同步:lock/unlock
  • 协作:Condition # await/signal/signalAll
public class PrintNumber {    /**     * 打印锁,同一时刻仅有一个任务可以持有此锁     */    private static Lock lock = new ReentrantLock();    private static Condition oddCondition = lock.newCondition();    private static Condition evenCondition = lock.newCondition();    /**     * 计数器     */    private static int counter = 1;    /**     * 计数器最大值     */    private static final int MAX_COUNTER = 100;    public static void main(String args[]) {        // 奇数打印线程        Thread oddThread = new Thread() {            @Override            public void run() {                try {                    // 请求打印锁                    lock.lock();                    while (counter <= MAX_COUNTER) {                        // counter为奇数,打印counter并唤醒偶数打印线程                        if (counter % 2 != 0) {                            System.out.println("Thread1 : " + counter);                            counter = counter + 1;                            evenCondition.signalAll();                        }                        // counter为偶数,挂起并等待偶数打印线程唤醒                        else {                            try {                                oddCondition.await();                            } catch (Exception e) {                                e.printStackTrace();                            }                        }                    }                } finally {                    // 释放打印锁                    lock.unlock();                }            }        };        // 偶数打印线程        Thread evenThread = new Thread() {            @Override            public void run() {                try {                    // 请求打印锁                    lock.lock();                    while (counter <= MAX_COUNTER) {                        // counter为偶数,打印counter并唤醒奇数打印线程                        if (counter % 2 == 0) {                            System.out.println("Thread2 : " + counter);                            counter = counter + 1;                            oddCondition.signalAll();                        }                        // counter为奇数,挂起并等待奇数打印线程唤醒                        else {                            try {                                evenCondition.await();                            } catch (Exception e) {                                e.printStackTrace();                            }                        }                    }                } finally {                    // 释放打印锁                    lock.unlock();                }            }        };        oddThread.start();        evenThread.start();    }}

 

 

转载地址:http://fnaii.baihongyu.com/

你可能感兴趣的文章
Java并发编程1-线程池
查看>>
CentOS7,玩转samba服务,基于身份验证的共享
查看>>
计算机网络-网络协议模型
查看>>
计算机网络-OSI各层概述
查看>>
Java--String/StringBuffer/StringBuilder区别
查看>>
mySQL--深入理解事务隔离级别
查看>>
分布式之redis复习精讲
查看>>
数据结构与算法7-栈
查看>>
线性数据结构学习笔记
查看>>
Java并发编程 | 一不小心就死锁了,怎么办?
查看>>
(python版)《剑指Offer》JZ01:二维数组中的查找
查看>>
(python版)《剑指Offer》JZ06:旋转数组的最小数字
查看>>
(python版)《剑指Offer》JZ13:调整数组顺序使奇数位于偶数前面
查看>>
(python版)《剑指Offer》JZ28:数组中出现次数超过一半的数字
查看>>
(python版)《剑指Offer》JZ30:连续子数组的最大和
查看>>
(python版)《剑指Offer》JZ32:把数组排成最小的数
查看>>
(python版)《剑指Offer》JZ02:替换空格
查看>>
JSP/Servlet——MVC设计模式
查看>>
使用JSTL
查看>>
Java 8新特性:Stream API
查看>>