笔试题:编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。

来源:互联网 发布:ipv6网络是什么 编辑:程序博客网 时间:2024/03/29 21:36

这是最近笔试遇到一个多线程题,当时没有做出来,后来经过查找后,找到两种写法。

方法一:利用Lock和Condition来实现,代码如下



public class PrintABC {
private String printFlag = "A";
private Lock lock = new ReentrantLock();
private Condition c1 = lock.newCondition();
private Condition c2 = lock.newCondition();
private Condition c3 = lock.newCondition();

public void printA(){
lock.lock();
try {
if(!printFlag.equals("A")){//1.判断是否到了状态  是-继续往下走  否-让当前线程处于等待状态
c1.await();//造成当前线程在接到信号或被中断之前一直处于等待状态。
}
System.out.println(Thread.currentThread().getName());//2.输出
printFlag = "B"; //3.将后续状态改为输出B
c2.signal();//4.唤醒输出B的线程
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
lock.unlock();
}
}


public void printB(){
lock.lock();
try {
if(!printFlag.equals("B")){
c2.await();
}
System.out.println(Thread.currentThread().getName());
printFlag = "C";
c3.signal();
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
lock.unlock();
}
}

public void printC(){
lock.lock();
try {
if(!printFlag.equals("C")){
c3.await();
}
System.out.println(Thread.currentThread().getName());
printFlag = "A";
c1.signal();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//测试类
public static void main(String[] args) {
final PrintABC test = new PrintABC();
new Thread(new Runnable() {//创建名称为A的线程并启动
public void run() {
for(int x = 0;x<10;x++){//调用十次输出方法
test.printA();
}
}},"A").start();

new Thread(new Runnable() {//创建名称为B的线程并启动
public void run() {
for(int x = 0;x<10;x++){
test.printB();
}
}},"B").start();

new Thread(new Runnable() {//创建名称为C的线程并启动
public void run() {
for(int x = 0;x<10;x++){
test.printC();
}
}},"C").start();
}
}




方法二:利用Semaphore类来实现

代码如下:




public class PrintABC2 {
private Semaphore s1 = new Semaphore(0);//用于A线程
private Semaphore s2 = new Semaphore(0);//用于B线程
private Semaphore s3 = new Semaphore(0);//用于C线程

public Thread a;
public Thread b;
public Thread c;

public PrintABC2(){
a = new Thread() {
public void run() {
try {
s3.release();//释放C的许可
int i = 0;//计数器
while(i<10){
i++;
s3.acquire();//获得C输出线程的许可,将线程阻塞
System.out.print("A");//打印输出
s1.release();//把输出B的许可释放
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}

};
b = new Thread(){
public void run() {
try {
int i=0;
while(i<10){
i++;
s1.acquire();//获得A输出线程的许可,将其阻塞
System.out.print("B");//
s2.release();//释放输出B的许可
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
c = new Thread(){
public void run(){
try {
int i=0;
while(i<10){
i++;
s2.acquire();//获得输出B线程的许可,将其阻塞
System.out.print("C");
s3.release();//释放输出B的许可
}
} catch (InterruptedException e) {
e.printStackTrace();
}//
}
};
}

public void printStar(){
a.start();
b.start();
c.start();
}
public static void main(String[] args) {
PrintABC2 test = new PrintABC2();
test.printStar();
}
}


Semaphore是负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。也是操作系统中用于控制进程同步互斥的量。


0 0
原创粉丝点击