多线程循环打印ABC
2016-10-20 08:55
274 查看
朋友最近去公司应聘,遇到了这么一道面试题,利用多线程循环打印ABC,刚好我也在学习多线程,看了网上的一些例子,结合自己的理解,编写了一个例子,与大家一起探讨;该例子使用到synchronized(对象同步锁),wait(),notifyAll()是两个定义在Object类里的方法,可以用来控制线程的状态。
这两个方法最终调用的都是jvm级的native方法。随着jvm运行平台的不同可能有些许差异。
如果对象调用了wait方法就会使持有该对象的线程把该对象的控制权交出去,然后处于等待状态。
如果对象调用了notifyAll方法就会通知所有等待这个对象控制权的线程继续运行。
实现思路:
1、新建一个打印类PrintABC.java,处理打印ABC 业务逻辑;
2、 新建三个线程类,分别为:PrintAThread,PrintBThread,PrintCThread分别执行打印方法;开启三个线程,每个线程一次打印一个字母(PrintAThread打印 A,PrintBThread打印B,PrintCThread打印C),并且按照一定的顺序打印,当打印A的时候,其他线程处于阻塞状态,打印完A以后,将线程解锁,让打印B的那个线程开启,其他线程处于阻塞状态,同理打印C的时候,阻塞其他线程,这三个线程顺序循环,就达到顺序多次打印ABC的目的了;
打印类PrintABC.java:
class PrintABC {
private boolean printAThread = true;
private boolean printBThread = false;
private boolean printCThread = false;
public void excute() {
synchronized (this) {
while (!printAThread) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.print("A");
this.printAThread = false;
this.printBThread = true;
this.printCThread = false;
notifyAll();
}
}
public void excute2() {
synchronized (this) {
while (!printBThread) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.print("B");
this.printAThread = false;
this.printBThread = false;
this.printCThread = true;
notifyAll();
}
}
public void excute3() {
synchronized (this) {
while (!printCThread) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("C");
this.printAThread = true;
this.printBThread = false;
this.printCThread = false;
notifyAll();
}
}
}
线程类PrintAThread.java:
class PrintAThread extends Thread {
private PrintABC printABC ;
public PrintAThread(PrintABC printABC ) {
this.printABC = printABC ;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
this.printABC .excute();
}
}
}
线程类PrintBThread.java:
class PrintBThread extends Thread {
private PrintABC printABC ;
public PrintAThread(PrintABC printABC ) {
this.printABC = printABC ;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
this.printABC .excute2();
}
}
}
线程类PrintCThread.java:
class PrintCThread extends Thread {
private PrintABC printABC
;
public PrintAThread(PrintABC printABC
) {
this.printABC=
printABC;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
this.printABC.excute3();
}
}
}
测试类PrintABCThreadTest.java
public class PrintABCThreadTest {
public static void main(String[] args) {
ReaderABC readerABC = new ReaderABC();
new PrintAThread(readerABC).start();
new PrintBThread(readerABC).start();
new PrintCThread(readerABC).start();
}
}
最终控制台打印结果如下:
例子结束,如有错漏,请大家指出,谢谢!
备注:多线程,对象锁,线程等待, 通知相关知识都是编程比较重要的一部分,希望大家能掌握
这两个方法最终调用的都是jvm级的native方法。随着jvm运行平台的不同可能有些许差异。
如果对象调用了wait方法就会使持有该对象的线程把该对象的控制权交出去,然后处于等待状态。
如果对象调用了notifyAll方法就会通知所有等待这个对象控制权的线程继续运行。
实现思路:
1、新建一个打印类PrintABC.java,处理打印ABC 业务逻辑;
2、 新建三个线程类,分别为:PrintAThread,PrintBThread,PrintCThread分别执行打印方法;开启三个线程,每个线程一次打印一个字母(PrintAThread打印 A,PrintBThread打印B,PrintCThread打印C),并且按照一定的顺序打印,当打印A的时候,其他线程处于阻塞状态,打印完A以后,将线程解锁,让打印B的那个线程开启,其他线程处于阻塞状态,同理打印C的时候,阻塞其他线程,这三个线程顺序循环,就达到顺序多次打印ABC的目的了;
打印类PrintABC.java:
class PrintABC {
private boolean printAThread = true;
private boolean printBThread = false;
private boolean printCThread = false;
public void excute() {
synchronized (this) {
while (!printAThread) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.print("A");
this.printAThread = false;
this.printBThread = true;
this.printCThread = false;
notifyAll();
}
}
public void excute2() {
synchronized (this) {
while (!printBThread) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.print("B");
this.printAThread = false;
this.printBThread = false;
this.printCThread = true;
notifyAll();
}
}
public void excute3() {
synchronized (this) {
while (!printCThread) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("C");
this.printAThread = true;
this.printBThread = false;
this.printCThread = false;
notifyAll();
}
}
}
线程类PrintAThread.java:
class PrintAThread extends Thread {
private PrintABC printABC ;
public PrintAThread(PrintABC printABC ) {
this.printABC = printABC ;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
this.printABC .excute();
}
}
}
线程类PrintBThread.java:
class PrintBThread extends Thread {
private PrintABC printABC ;
public PrintAThread(PrintABC printABC ) {
this.printABC = printABC ;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
this.printABC .excute2();
}
}
}
线程类PrintCThread.java:
class PrintCThread extends Thread {
private PrintABC printABC
;
public PrintAThread(PrintABC printABC
) {
this.printABC=
printABC;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
this.printABC.excute3();
}
}
}
测试类PrintABCThreadTest.java
public class PrintABCThreadTest {
public static void main(String[] args) {
ReaderABC readerABC = new ReaderABC();
new PrintAThread(readerABC).start();
new PrintBThread(readerABC).start();
new PrintCThread(readerABC).start();
}
}
最终控制台打印结果如下:
例子结束,如有错漏,请大家指出,谢谢!
备注:多线程,对象锁,线程等待, 通知相关知识都是编程比较重要的一部分,希望大家能掌握
相关文章推荐
- Java多线程循环打印ABC 10次,可能是东半球最美解决方案了
- 迅雷笔试题 (JAVA多线程)启动三个线程,分别打印A B C,现在写一个程序 循环打印ABCABCABC
- Java多线程--三个线程分别打印a,b,c.请用多线程实现循环打印15次abc
- c++多线程实现循环打印ABC
- 多线程循环打印ABC10次
- Java多线程 循环打印ABC 10次
- 多线程(至少三个线程)分别打印A、B、C,要求按ABC的顺序循环打印10次。
- 有三个线程ID分别是ABC,用多线程编程在屏幕上循环打印ABCABC....十次
- 【机试】华为2014校招机试:多线程循环打印十次ABC
- 题目:有三个线程分别打印A、B、C,请用多线程编程实现,在屏幕打印10次ABC
- 面试题--三个线程循环打印ABC10次的几种解决方法
- 面试题--三个线程循环打印ABC 10次:另类解决方法
- JAVA 多线程开篇 -从按顺序打印ABC开始
- 循环打印三个线程,ABC 十次
- 多线程顺序打印ABC
- Java实现多线程经典问题:使用三个线程实现输出ABCABC循环
- 多线程循环打印
- Java 3个线程依次打印ABC,并且循环10次
- 多线程依次循环打印数据
- java多线程---顺序打印ABC的三种实现---ReentrantLock方式