笔试题:编写一个程序,开启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是负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。也是操作系统中用于控制进程同步互斥的量。
- 笔试题:编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推
- 润和面试题:开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC
- Accelerated C++<3-2>
- 如何把vim打造成IDE
- 用python完成一个爬虫,实现从豆瓣“西安单身小组”上抓取若干征男友帖子
- GYM 101147 D.Popcorn(水~)
- Linux java环境配置命令
- 笔试题:编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 蓝桥杯真题 39层台阶(dfs)
- 二叉树非递归遍历复习代码实现
- 动态脱敏和静态脱敏
- cronolog使用(日志管理)
- ViewPager的无限轮播,和shape的小圆点使用,及webview显示进度条
- lua与c#交互篇(性能)
- SLAM的一点认识
- 半平面交自用模板