读书人

运用java多线程顺序打印“ABCABC”

发布时间: 2012-08-29 08:40:14 作者: rapoo

使用java多线程顺序打印“ABCABC”
今天看到这么一道多线程题:有三个线程,每个线程有一个属性flag,假设每个线程的flag值顺序为“A”、“B”、“C”,编写一段代码在控制台顺序输出“ABCABC”。

因为线程执行不是按顺序执行的,如果需要按顺序执行,则需要加锁。现在设想有一个对象“lock”作为这三个线程共用的锁,“lock”控制每个线程的“输出flag值到控制台”的代码。每个线程在start后,都需要去检查是否获得了”lock“的锁(锁的分配是都虚拟机分配的,貌似),如果获得了锁,则执行相关代码,如果没有获得锁,则挂起,等待系统下次调用。

示例代码

package com.jrkui.thread;public class OrderPrintThread extends Thread{private Lock lock;private String flag;public OrderPrintThread(String flag, Lock lock) {this.flag = flag;this.lock = lock;}@Overridepublic void run() {int count = 2;while(count > 0){synchronized (lock) {if(lock.getFlag().equals(flag)){System.out.print(flag);count--;if("A".equals(flag))lock.setFlag("B");else if("B".equals(flag))lock.setFlag("C");else if("C".equals(flag))lock.setFlag("A");}}}}public static void main(String[] args) {Lock lock = new Lock();lock.setFlag("A");OrderPrintThread thread1 = new OrderPrintThread("A", lock);OrderPrintThread thread2 = new OrderPrintThread("B", lock);OrderPrintThread thread3 = new OrderPrintThread("C", lock);thread1.start();thread2.start();thread3.start();}}class Lock {private String flag;public void setFlag(String flag) {this.flag = flag;}public String getFlag() {return flag;}}

synchronized关键字就是为”lock“对象加锁。加上synchronized关键字后,每次只能有一个线程调用被加锁的代码段(变量,方法)。

读书人网 >编程

热点推荐