概述

作为程序员经常在面试的时候遇到多线程的问题,我印象比较深刻的就是下面这道题:写两个线程,一个线程打印 1~52,另一个线程打印字母A-Z。打印顺序为12A34B56C……5152Z。看这个题目已经说得很清楚了,要用两个线程交替打印出12A....Z,我相信如每个线程单独打印的话肯定没问题,但是要交替打印,就需要两个线程互相合作,就需要通信。

代码实现

方法一

 package com.cfxmn.springboot.springbootDemo.test;

 // 使用多线程打印12A34B.......5152Z
public class MainTest2 {
public static void main(String[] args) {
Object obj = new Object(); // 共享资源,实现线程间的通信
Thread printNum = new Thread(new PrintNum(obj));
Thread printChar = new Thread(new PrintChar(obj));
printNum.start();
printChar.start();
}
} // 打印数字
class PrintNum implements Runnable { private Object object; public PrintNum (Object obj) {
this.object = obj;
} @Override
public void run() {
synchronized (object) {
for (int i=1;i<=52;i++) {
System.out.print(i);
if (i % 2 == 0) {
object.notifyAll(); // 先唤醒所有线程
try {
object.wait(); // 阻塞当前线程
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
} } // 打印字母
class PrintChar implements Runnable { private Object object; public PrintChar (Object obj) {
this.object = obj;
} @Override
public void run() {
synchronized (object) {
for (int i=65;i<=90;i++) {
System.out.print((char)i);
object.notifyAll(); // 先唤醒所有线程
try {
object.wait(); // 阻塞当前线程
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} }

运行结果:

12A34B56C78D910E1112F1314G1516H1718I1920J2122K2324L2526M2728N2930O3132P3334Q3536R3738S3940T4142U4344V4546W4748X4950Y5152Z

上面我是使用了wait,notifyAll,synchronized实现的,是不是还有其他的实现方法呢?

方法二

 package com.cfxmn.springboot.springbootDemo.test;

 import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; //使用多线程打印12A34B.......5152Z
public class MainTest3 { private Lock lock = new ReentrantLock();
private Condition printNum = lock.newCondition();
private Condition printchar = lock.newCondition(); public static void main(String[] args) {
MainTest3 test = new MainTest3();
Thread printNum = new Thread(test.new PrintNumt());
Thread printChar = new Thread(test.new PrintChart());
printChar.start();
printNum.start(); } //打印数字
class PrintNumt implements Runnable { @Override
public void run() { for (int i = 1; i <= 52; i++) {
lock.lock();
try {
printchar.signalAll();
System.out.print(i);
if (i % 2 == 0) {
printNum.await();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
} } //打印字母
class PrintChart implements Runnable { @Override
public void run() { for (int i = 0; i < 26; i++) {
lock.lock();
try {
printNum.signalAll();
System.out.print((char)(i + 'A'));
printchar.await();
} catch (Exception e) {
e.printStackTrace(); } finally {
lock.unlock();
}
} } }
}

这边使用了lock,和condition来实现,它的两个方法signalAll,await相当于notifyAll,wait,效果是一样的。

最新文章

  1. 微软KinectV2深度传感器在Ubuntu上的配置和使用
  2. C# UdpClient使用Receive和BeginReceive接收消息时的不同写法
  3. Adobe Dreamweaver代码编辑
  4. 【AI】蒙特卡洛搜索树
  5. [BZOJ1370][Baltic2003]Gang团伙
  6. Android编程: 环境搭建、基本知识
  7. Asp.net TextBox常规输入验证
  8. Java基础知识强化之IO流笔记64:合并流SequenceInputStream
  9. Linq101-CustomSequence
  10. android开发工具类总结(一)
  11. HUST 1541 Student’s question
  12. listener.ora--sqlnet.ora--tnsnames.ora的关系以及手工配置举例(转载:http://blog.chinaunix.net/uid-83572-id-5510.ht)
  13. ILRuntime入门笔记
  14. 算法笔记--manacher算法
  15. ZigZag Conversion 之字形转换字符串
  16. 【bzoj 1901】Zju2112 Dynamic Rankings
  17. JavaWeb(一)Servlet
  18. ElasticSearch5.0之后的改变
  19. 如何将一个HTML页面嵌套在另一个页面中
  20. golang学习笔记8 beego参数配置 打包linux命令

热门文章

  1. Django模板语言
  2. 王之泰201771010131《面向对象程序设计(java)》第十四周学习总结
  3. Spring循环依赖问题
  4. java 有序数组合并
  5. vue入门练习(一)
  6. 跨域获取后台日期-ASP
  7. Bate冲刺 第四天
  8. Spark2.X管理与开发
  9. Shiro 与spring 整合的及简单使用(转)
  10. mybatis ResultMap详解