使用Java线程并发库实现两个线程交替打印的线程题
背景:是这样的今天在地铁上浏览了以下网页,看到网上一朋友问了一个多线程的问题。晚上闲着没事就决定把它实现出来。
题目:
1.开启两个线程,一个线程打印A~Z,两一个线程打印1~52的数据。
2.实现交替打印,输出结果为12A34B...........5152Z.
3.请用多线程方式实现。
这种只有两个线程交替打印数据的题目其实相对还是比较简单的,如果利用传统线程无非就是synchronized(线程互斥)与wait(),notify()的问题。
今天不用传统线程解决这个问题,我们用Java 1.5提供的线程并发库中的类来实现这个功能(实现流程和传统线程一样)
下面是实现代码(我都加了注释,如果还是不同大家可以查看Java 1.5以上的帮助文档)
package cn.yw.thread.practice;import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;/*** 多线程练习:* 1.开启一个线程打印1~52,开启另一个线程打印A~Z* 打印方式:12A34B46C依次打印* @author yw-tony**/ public class PracticeTest {public static void main(String[] args){final DataPrint data = new DataPrint();//打印字母的线程(大家也可以把这两个线程抽取出来作为两个单独的类,这里为了实现简单我就直接写在main方法中了)new Thread(new Runnable(){@Overridepublic void run() {while(data.letterFlag){data.printLetter();}}}).start();//打印数字的线程new Thread(new Runnable(){@Overridepublic void run() {while(data.numFlag){data.printNun();}}}).start();}/*** 打印类* @author yw-tony**/static class DataPrint{public boolean letterFlag = true;//线程结束标记;public boolean numFlag = true;//数字的初始值int num = 1;//字母的初始值//这里A~Z的字母对应的阿拉伯数字为65~90,int letter = 65;//线程等待标记boolean flag = true;//java线程并发库中的锁相当与(synchronized)Lock lock = new ReentrantLock();//线程并发库中用于线程之间通讯的类相当于wait(),notify()Condition condLetter = lock.newCondition();Condition condNum = lock.newCondition();/*** 打印字字母的方法**/public void printLetter(){//如果打印到Z则结束线程并停止if(letter > 90 ){letterFlag = false;return ;} //锁定代码块,锁定时其他线程不能访问其中内容 lock.lock();try{if(flag){//如果执行打印数字的线程正在执行,则该线程进入等待状态 condLetter.await();}System.out.println(Thread.currentThread().getName()+":"+(char)letter);letter++;Thread.sleep(100);//打印执行完成,唤醒打印数字的线程flag = true;condNum.signal();}catch(Exception e){e.printStackTrace();}finally{//解锁当前代码快 lock.unlock();}}/*** 打印数字的方法*/public void printNun(){//如果打印到52则结束线程并停止if(num > 52){numFlag = false;return;}lock.lock();try{if(!flag){condNum.await();}System.out.println(Thread.currentThread().getName()+":"+num);num++;System.out.println(Thread.currentThread().getName()+":"+num);num++;Thread.sleep(100);flag = false;condLetter.signal();//唤醒打印字母的线程}catch(Exception e){e.printStackTrace();}finally{lock.unlock();}}} }
原文在判断线程终止的条件上有些问题,原代码不能输出Z,>=修改为>
使用Java线程并发库实现两个线程交替打印的线程题相关推荐
- java基础巩固笔记(5)-多线程之线程并发库
2019独角兽企业重金招聘Python工程师标准>>> java基础巩固笔记(5)-多线程之线程并发库 标签: java [TOC] 本文主要概述java.util.concurre ...
- Java多线程与线程并发库高级应用笔记
以下内容是学习张老师Java多线程与线程并发库高级应用时所做的笔记,很有用 网络编辑器直接复制Word文档排版有点乱,提供原始文件下载 先看源文件概貌 张孝祥_Java多线程与并发库高级应用 [视频介 ...
- 线程并发库和线程池的作用_线程和并发介绍
线程并发库和线程池的作用 本文是我们名为Java Concurrency Essentials的学院课程的一部分. 在本课程中,您将深入探讨并发的魔力. 将向您介绍并发和并发代码的基础知识,并学习诸如 ...
- Java5线程并发库之LOCK(锁)CONDITION(条件)实现线程同步通信
为什么80%的码农都做不了架构师?>>> Lock(锁)&Condition(条件)实现线程同步通信 接下来介绍,java5线程并发库里面的锁.跟锁有关的类和接口主要是 ...
- 线程并发库和线程池的作用_并发–顺序线程和原始线程
线程并发库和线程池的作用 不久前,我参与了一个项目,该项目的报告流程如下: 用户会要求举报 报告要求将被翻译成较小的部分 基于零件/节的类型的每个零件的报告将由报告生成器生成 组成报告的各个部分将重新 ...
- Java多线程(五) —— 线程并发库之锁机制
参考文献: http://www.blogjava.net/xylz/archive/2010/07/08/325587.html 一.Lock与ReentrantLock 前面的章节主要谈谈原子操作 ...
- java线程并发库之--线程同步工具Exchanger的使用
Exchanger可以在两个线程之间交换数据,只能是2个线程,他不支持更多的线程之间互换数据.今天我们就通过实例来学习一下Exchanger的用法. Exchanger的简单实例 Exchanger是 ...
- Java5的 线程并发库
java.util.concurrent.atomic 一个小型工具包,支持单个变量上的无锁线程安全编程. 包含的类: 这些类的相关操作都是原子性的 java.util.concurrent 线程池 ...
- Java5线程并发库之保障变量的原子性操作
为什么80%的码农都做不了架构师?>>> java.util.concurrent.atomic 首先我们看java.util.concurrent.atomic包,它主要是提 ...
最新文章
- 配置动态路由协议OSPF
- ZooKeeper配额
- SDWAN动态路径选择是什么?SDWAN成本降低的意义是什么?
- jQuery easyUI--accordion折叠面板
- select2 change之前的改变
- linux内核研究(一)
- 在Visual Studio中利用NTVS创建Pomelo项目
- .jardesc文件
- makefile之文件搜索(5)
- Android程序打开和关闭输入法
- 实用常识 | 文件都在C盘,一点儿都不圆润,盘它!
- [转]ORA-01555错误总结(二)
- 用MFC消息映射机制自定义消息
- tomcat并发优化
- lch 儿童围棋课堂 初级篇2 (李昌镐 著)
- jmeter连接mysql时jdbc下载
- office和flash计算机课程,Powerpoint和Flash制作教学课件技巧
- 无盘php,MZD无盘系统160台网吧安装实战教程
- python 线性相关 与 线性拟合
- websocket前端向后端传数据时出现Buffer
热门文章
- [翻译] DoImagePickerController
- VC++2012编程演练数据结构《35》多路平衡归并
- vi编辑器的学习使用(二十)
- C/C++排序算法(6)堆排序
- 北大OJ(POJ 2808)校门外的树
- 数据库-MySQL-SQL语句
- mtk android手机 代码问题,MTK用户必备 Android手机也能系统恢复
- c语言期末考试复习题,C语言期末考试复习资料 计算机等级考试复习题目
- c语言switch自动贩卖机,JAVA程式-自动贩卖机SWITCHampCASE.doc
- java定时器小程序_【微信小程序】使用setTimeout试试定时器