多线程面试题(迅雷)

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

我的思路是这样的:每个线程都有一个公用的锁,谁先拿到锁,谁就判断是不是该我输出ID,如果不是我输出,我就释放锁,并继续申请等待锁 (wait),如果是我输出,我就输出,并且释放锁并且唤醒那些正在等待申请锁的线程(notify),那如何控制 A->B->C->A这样的循环输出呢,因为被唤醒的线程是不确定的,如果A线程唤醒了C线程呢,那C线程必须判断是否输出,如果不该 轮到自己,就必须释放锁,而去唤醒别人,直到唤醒的线程就是B为止。

以下是我的实现:

public class ABCOutputThread implements Runnable{

private static String now = "A";

private final static String lock = "lock";

private String name,next;

public ABCOutputThread(String name,String next) {

this.name = name;

this.next = next;

}

@Override

public void run() {

int i=10;

while(i>0){

// System.out.print(this.name+" begin to get lock ");

synchronized (lock) {

// System.out.print(this.name+" get it ");

if(this.name.equals(now)){

// System.out.print(this.name+" my turn ");

System.out.print(this.name);

now = next;

--i;

// System.out.print(this.name+" notify other wait thread ");

try {lock.notifyAll();} catch (IllegalMonitorStateException e) {e.printStackTrace();}

}else{

// System.out.print(this.name+" not my turn and wait the other notify me ");

try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}

}

}

}

}

public static void main(String[] args) {

Thread t1 = new Thread(new ABCOutputThread("A","B"));

Thread t2 = new Thread(new ABCOutputThread("B","C"));

Thread t3 = new Thread(new ABCOutputThread("C","A"));

t1.start();

t2.start();

t3.start();

}

}

一开始我写的是lock.notify(),而不是lock.notifyAll(),以至于运行的时候只输出ABC,而没有循环10次的效果,但是debug下又能循环10次。这是为什么呢,后来在程序代码中加入了System.out.print调试语句,发现,notify只会唤醒一个线程,考虑这样一种场景:

1、A获得锁,成功输出A后释放了锁,唤醒一个线程

2、恰巧唤醒的是自己,发现不该轮到自己输出,就释放锁等待,但没有唤醒任何线程

3、同时BC在等待A唤醒,A没有唤醒任何人,它调用的是wait,故三个线程全部“睡着了”

notify是唤醒一个线程的意思,仅仅唤醒一个而已,唤醒的是别人还是自己,是不确定的,而如果notifyAll则会唤醒所有的线程,让所有的线程都有机会去争用锁,个人觉得这样做有浪费资源的嫌疑,接下来我会看看有没有办法就唤醒特定对象,做到精确唤醒。

baidu查过了,没有找到精确唤醒方式!!!!!!!!!!!!!!!

时间: 2024-10-31 08:29:25

多线程面试题(迅雷)的相关文章

15个顶级多线程面试题及答案

Java 线程面试问题 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程的问题.在投资银行业务中多线程和并发是一个非常受欢迎的话题,特别是电子交易发展方面相关的.他们会问面试者很多令人混淆的Java线程问题.面试官只是想确信面试者有足够的Java线程与并发方面的知识,因为候选人中有很多只浮于表面.用于直接面向市场交易的高容量和低延时的电子交易系统在本质上是并发的.下面这些是我在不同时间不同地点喜欢问的Jav

【java】:多线程面试题

经常面试的时候,让写各种乱七八糟的多线程面试题,收集了很多,有些还是挺好玩的. 1.编写程序实现,子线程循环10次,接着主线程循环20次,接着再子线程循环10次,主线程循环20次,如此反复,循环50次. package com.zhikui.interview; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks

JAVA学习第二十八课(多线程(七))- 停止线程和多线程面试题

重点掌握 /* * wait 和 sleep 区别? * 1.wait可以指定时间也可以不指定 * sleep必须指定时间 * 2.在同步中,对CPU的执行权和锁的处理不同 * wait释放执行权,释放锁    sleep释放执行权,不释放锁 */ //同步里具备执行资格的线程不止一个,但是能得到锁的只有一个,所以能执行的也只有一个 一.停止线程的方式 不可能让线程一直在运行,所以需要让线程停止 1.定义循环结束标记 一般而言,线程运行代码都是循环的,只要控制了循环就可以结束任务 2.使用int

15个顶级Java多线程面试题及回答

Java 线程面试问题 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程 的问题.在投资银行业务中多线程和并发是一个非常受欢迎的话题,特别是电子交易发展方面相关的.他们会问面试者很多令人混淆的Java线程问题.面试官只 是想确信面试者有足够的Java线程与并发方面的知识,因为候选人中有很多只浮于表面.用于直接面向市场交易的高容量和低延时的电子交易系统在本质上是并 发的.下面这些是我在不同时间不同地点喜欢问的

java多线程面试题整理及答案(2018年)

java多线程面试题整理及答案(2018年) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对 运算密集型任务提速.比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒.Java在语言层面对多线程提供了卓越的支 持,它也是一个很好的卖点. 线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务.不同的进程使用不同的内存空间,而所

秒杀多线程面试题系列

[ 专栏 ]- 秒杀多线程面试题系列 - MoreWindows Blog(格物穷理,以求自由!) - CSDN博客   PV原语操作详解 - Benson_xiong - 博客园   原文地址:https://www.cnblogs.com/zhehan54/p/10053582.html

一线大厂面试官最喜欢问的15道Java多线程面试题

前言 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得更多职位,那么你应该准备很多关于多线程的问题. 他们会问面试者很多令人混淆的Java线程问题.面试官只是想确信面试者有足够的Java线程与并发方面的知识,因为候选人中有很多只浮于表面.现在引用Java5并发包关于并发工具和并发集合的问题正在增多.那些问题中ThreadLocal.Blocking Queue.Counting Semaphore和ConcurrentHashMap比较流行. Java多线程面试题及

java多线程面试题选择题大全含答案

v java多线程面试题选择题大全含答案 1.下面程序的运行结果()(选择一项)public static void main(String[] args) {Thread t=new Thread(){public void run(){pong();}};t.run();System.out.println("ping");}static void pong(){System.out.println("pong");}A. pingpongB. pongping

程序员Java架构师多线程面试题和回答解析

当我们在Java架构师面试的过程中常见的多线程和并发方面的问题肯定是必不可少的一部分.那么在面试之前我们更应该多准备一些关于多线程方面的问题. 面试官只是想确信面试者有足够的Java线程与并发方面的知识,因为有很多只停留于表面的理论知识,归根结底还是功力不够扎实.下面这些是我在不同时间不同地点喜欢问的Java线程问题,供大家参考. 15个Java架构师多线程面试题及回答解析 1)你将如何使用threaddump?你将如何分析Threaddump? 在UNIX中你可以使用kill-3,然后thre

阿里大佬总结的40个多线程面试题,你能答上来几个?

原文地址:https://www.cnblogs.com/xrq730/p/5060921.html 1.多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡.所谓"知其然知其所以然","会用"只是"知其然","为什么用"才是"知其所以然",只有达到"知其然知其所以然"的程度才可以说是把一个知识点运用自如.OK,下面说说我对