使用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(){
@Override
public void run() {
while(data.letterFlag){
data.printLetter();
}
}
}).start(); //打印数字的线程
new Thread(new Runnable(){
@Override
public 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();
}
}
}
}
使用Java线程并发库实现两个线程交替打印的线程题的更多相关文章
- Java多线程与并发库高级应用-java5线程并发库
java5 中的线程并发库 主要在java.util.concurrent包中 还有 java.util.concurrent.atomic子包和java.util.concurrent.lock子包 ...
- 线程高级应用-心得5-java5线程并发库中Lock和Condition实现线程同步通讯
1.Lock相关知识介绍 好比我同时种了几块地的麦子,然后就等待收割.收割时,则是哪块先熟了,先收割哪块. 下面举一个面试题的例子来引出Lock缓存读写锁的案例,一个load()和get()方法返回值 ...
- java--加强之 Java5的线程并发库
转载请申明出处:http://blog.csdn.net/xmxkf/article/details/9945499 01. 传统线程技术回顾 创建线程的两种传统方式: 1.在Thread子类覆盖的r ...
- 03.Java多线程并发库API使用2
1.多个线程之间共享数据的方式探讨 1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 2.如果每个线程执行的代 ...
- 线程高级应用-心得8-java5线程并发库中同步集合Collections工具类的应用及案例分析
1. HashSet与HashMap的联系与区别? 区别:前者是单列后者是双列,就是hashmap有键有值,hashset只有键: 联系:HashSet的底层就是HashMap,可以参考HashSe ...
- 线程高级应用-心得4-java5线程并发库介绍,及新技术案例分析
1. java5线程并发库新知识介绍 2.线程并发库案例分析 package com.itcast.family; import java.util.concurrent.ExecutorServi ...
- java高并发系列 - 第5天:深入理解进程和线程
进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.程序是指令.数据及其组织形式的描述,进程是程序的实体. 进程具有的 ...
- Java多线程(六) —— 线程并发库之并发容器
参考文献: http://www.blogjava.net/xylz/archive/2010/07/19/326527.html 一.ConcurrentMap API 从这一节开始正式进入并发容器 ...
- Java多线程(五) —— 线程并发库之锁机制
参考文献: http://www.blogjava.net/xylz/archive/2010/07/08/325587.html 一.Lock与ReentrantLock 前面的章节主要谈谈原子操作 ...
随机推荐
- 【代码笔记】iOS-给密码进行加密
一,工程图. 二,代码. #import "ViewController.h" #import "Base64CodeByteFunc.h" @interfac ...
- jq塞入不同状态html的写法 switch (defaults.type)
(function($) { //生成一个block function createBlock(options) { var defaults = { type: "1", } v ...
- 转 [PHP] - 性能加速 - 开启Opcache
原文地址:[PHP] - 性能加速 - 开启Opcache PHP7已经发布了, 作为PHP10年来最大的版本升级, 最大的性能升级, PHP7在多放的测试中都表现出很明显的性能提升 一.开启Opc ...
- SD从零开始07-08
SD从零开始7 行项目类别 Item Category的例子: 系统交付的不同的Item category支持不同的业务流程,可以根据它来创建自定义的: 定义为4位的key:前2位提示销售凭证类型,后 ...
- 用php和ajax写一个省市区的三级联动,实现地区的下拉选择
要实现这个页面的三级联动,我们需要建立三个php文件,第一个php文件我们导入jQuery文件,里面嵌入JavaScript:第二个php文件我们做一个php的处理页面,里面引入我们封装好的数据库类文 ...
- Jmeter 测试结果分析之聚合报告简介
Jmeter 测试结果分析之聚合报告简介 by:授客 QQ:1033553122 聚合报告(aggregate report) 对于每个请求,它统计响应信息并提供请求数,平均值,最大,最小值,错误率, ...
- AndroidStudio 3.0升级之compile、implementation简要说明
1.现象 androidStudio 升级至3.0后 之前引用库所使用的complie默认变成implementation 如以下: 3.0之前 compile 'io.reactivex.rxjav ...
- nodejs设置NODE_ENV环境变量(2)
引的人家的,原文地址:http://sorex.cnblogs.com/p/6200940.html 环境变量 环境变量是操作系统运行环境的一些参数.在开发环境或者部署环境中都需要使用到.本文讲述了使 ...
- 双启动:安装Windows 7 和 CentOS 7 双系统教程
笔记本配置:8G内存,200G SSD,先在virbox中成功安装双系统,能正常进入并使用 Windows 7 和 CentOS 7. 网上看到一大堆的安装 wingrub easyBCD,折腾了一 ...
- windows7下搭建python环境并用pip安装networkx
1.安装顺序:Python+pip+pywin32+numpy+matplotlib+networkx 2.版本问题 所安装的所有程序和包都需要具有统一的python版本.系统版本和位宽,所以第一步要 ...