背景:是这样的今天在地铁上浏览了以下网页,看到网上一朋友问了一个多线程的问题。晚上闲着没事就决定把它实现出来。

题目:

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线程并发库实现两个线程交替打印的线程题相关推荐

  1. java基础巩固笔记(5)-多线程之线程并发库

    2019独角兽企业重金招聘Python工程师标准>>> java基础巩固笔记(5)-多线程之线程并发库 标签: java [TOC] 本文主要概述java.util.concurre ...

  2. Java多线程与线程并发库高级应用笔记

    以下内容是学习张老师Java多线程与线程并发库高级应用时所做的笔记,很有用 网络编辑器直接复制Word文档排版有点乱,提供原始文件下载 先看源文件概貌 张孝祥_Java多线程与并发库高级应用 [视频介 ...

  3. 线程并发库和线程池的作用_线程和并发介绍

    线程并发库和线程池的作用 本文是我们名为Java Concurrency Essentials的学院课程的一部分. 在本课程中,您将深入探讨并发的魔力. 将向您介绍并发和并发代码的基础知识,并学习诸如 ...

  4. Java5线程并发库之LOCK(锁)CONDITION(条件)实现线程同步通信

    为什么80%的码农都做不了架构师?>>>    Lock(锁)&Condition(条件)实现线程同步通信 接下来介绍,java5线程并发库里面的锁.跟锁有关的类和接口主要是 ...

  5. 线程并发库和线程池的作用_并发–顺序线程和原始线程

    线程并发库和线程池的作用 不久前,我参与了一个项目,该项目的报告流程如下: 用户会要求举报 报告要求将被翻译成较小的部分 基于零件/节的类型的每个零件的报告将由报告生成器生成 组成报告的各个部分将重新 ...

  6. Java多线程(五) —— 线程并发库之锁机制

    参考文献: http://www.blogjava.net/xylz/archive/2010/07/08/325587.html 一.Lock与ReentrantLock 前面的章节主要谈谈原子操作 ...

  7. java线程并发库之--线程同步工具Exchanger的使用

    Exchanger可以在两个线程之间交换数据,只能是2个线程,他不支持更多的线程之间互换数据.今天我们就通过实例来学习一下Exchanger的用法. Exchanger的简单实例 Exchanger是 ...

  8. Java5的 线程并发库

    java.util.concurrent.atomic 一个小型工具包,支持单个变量上的无锁线程安全编程. 包含的类: 这些类的相关操作都是原子性的 java.util.concurrent 线程池 ...

  9. Java5线程并发库之保障变量的原子性操作

    为什么80%的码农都做不了架构师?>>>    java.util.concurrent.atomic 首先我们看java.util.concurrent.atomic包,它主要是提 ...

最新文章

  1. 配置动态路由协议OSPF
  2. ZooKeeper配额
  3. SDWAN动态路径选择是什么?SDWAN成本降低的意义是什么?
  4. jQuery easyUI--accordion折叠面板
  5. select2 change之前的改变
  6. linux内核研究(一)
  7. 在Visual Studio中利用NTVS创建Pomelo项目
  8. .jardesc文件
  9. makefile之文件搜索(5)
  10. Android程序打开和关闭输入法
  11. 实用常识 | 文件都在C盘,一点儿都不圆润,盘它!
  12. [转]ORA-01555错误总结(二)
  13. 用MFC消息映射机制自定义消息
  14. tomcat并发优化
  15. lch 儿童围棋课堂 初级篇2 (李昌镐 著)
  16. jmeter连接mysql时jdbc下载
  17. office和flash计算机课程,Powerpoint和Flash制作教学课件技巧
  18. 无盘php,MZD无盘系统160台网吧安装实战教程
  19. python 线性相关 与 线性拟合
  20. websocket前端向后端传数据时出现Buffer

热门文章

  1. [翻译] DoImagePickerController
  2. VC++2012编程演练数据结构《35》多路平衡归并
  3. vi编辑器的学习使用(二十)
  4. C/C++排序算法(6)堆排序
  5. 北大OJ(POJ 2808)校门外的树
  6. 数据库-MySQL-SQL语句
  7. mtk android手机 代码问题,MTK用户必备 Android手机也能系统恢复
  8. c语言期末考试复习题,C语言期末考试复习资料 计算机等级考试复习题目
  9. c语言switch自动贩卖机,JAVA程式-自动贩卖机SWITCHampCASE.doc
  10. java定时器小程序_【微信小程序】使用setTimeout试试定时器