使用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;
}

@Override
public 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关键字后,每次只能有一个线程调用被加锁的代码段(变量,方法)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值