三线程打印ABC的面试题

正确的代码是这样的:
public class MutliThreadPrintABC implements Runnable{

//打印内容
String content;
//两个锁
Object prev;
Object self;

public MutliThreadPrintABC(String content,Object prev,Object self) {
    this.content=content;
    this.prev=prev;
    this.self=self;
}

@Override
public void run() {
    for(int i=0;i<10;i++){
        synchronized (prev) {
            System.out.println(Thread.currentThread().getName()+"获取到了前一个线程的锁");
            synchronized (self) {
                System.out.println(content);
                self.notify();
            }
            try {
                prev.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public static void main(String[] args) throws InterruptedException {
    Object a = new Object();
    Object b = new Object();
    Object c = new Object();
    Thread A = new Thread(new MutliThreadPrintABC("A",c,a));
    A.setName("A");
    Thread B = new Thread(new MutliThreadPrintABC("B",a,b));
    B.setName("B");
    Thread C = new Thread(new MutliThreadPrintABC("C",b,c));
    C.setName("C");
    A.start();
    Thread.sleep(100);
    B.start();
    Thread.sleep(100);
    C.start();
}

}
我在学习这个的时候写了个错误的版本就是释放锁这一部分prev.wait()写到了最里面的同步块里:
public void run() {
for(int i=0;i<10;i++){
synchronized (prev) {
System.out.println(Thread.currentThread().getName()+"获取到了前一个线程的锁");
synchronized (self) {
System.out.println(content);
self.notify();
try {
prev.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
这个时候程序运行会卡住,而且是A线程执行完就直接执行了C线程,而且都只打印了一次就卡住了,我实在搞不懂为什么B线程没拿到A线程执行完释放的锁,这个错误版本到底程序是怎么执行的,本人小白没干过多线程的工作,正在学习,求大佬解释一下

0

3个回答

prev.wait();写在synchronized (prev)里面
一旦prev被锁,它就没有机会再执行出来了。

0
Jake_JJJ
Jake_JJJ 错了把。。是放在self锁中,如果self锁被使用中,那么这样prev锁永远无法被释放
10 个月之前 回复

看我博客吧 这个用ReentrantLock和Condition来实现。

0
0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
顺序打印ABC------java多线程的一道经典面试题
这是迅雷的一道面试题,顺序打印ABC十次。 源代码如下 public class PrintABC { public static Boolean isThreadA = true; public static Boolean isThreadB = false; public static Boolean isThreadC = false; public static void
java多线程面试题:三个线程顺序打印ABC,重复10次
这个面试题,比较经典。有不同的解决思路。有的博文是用Join去实现。我面试的时候也是第一个想到的是用join叫A线程等待B线程执行完再执行。这样的思路能实现,但是不好。虽然当时凑合着说服了面试官。先把代码贴出来 private Thread aThread,bThread,cThread; @Test public void test1() { aThread=new Thr
java多线程面试题,三个线程顺序打印ABC
package com.jinyi.medical.unsynch;import java.util.concurrent.TimeUnit; public class Test_ssss implements Runnable{ private String name; private Object pre; private Object self; public Te
面试题--三个线程循环打印ABC10次的几种解决方法
面试题--三个线程循环打印ABC10次的几种解决方法 博客分类: 多线程Java面试题 多线程javathreadSemaphoreCondition  最近发现公司有份笔试试卷中有道多线程的题目:有三个线程分别打印A、B、C,请用多线程编程实现,在屏幕上循环打印10次ABCABC… 这个最早好像是迅雷的面试题目吧,看到了然后就想重温一下这个题目的解决方法。
【面试】--三个线程轮流打印ABC
1 lock实现 public class ABCLock { private static Lock lock = new ReentrantLock(); private static Condition conditionA = lock.newCondition(); private static Condition conditionB = lock.ne
三个线程循环打印abc十次
朋友问的题,试着写写。也许有其他实现方式,感觉题目应该是考察线程间协作wait和notify所以选择如下方式实现: [code=&quot;java&quot;] /** * @author my_corner * 2011-12-26 */ public class ThreadPrint { /** * @author my_corner * @param * @re...
面试题--三个线程循环打印ABC10次的几种解决方法
最近发现公司有份笔试试卷中有道多线程的[b]题目[/b]:[color=blue][b]有三个线程分别打印A、B、C,请用多线程编程实现,在屏幕上循环打印10次ABCABC…[/b][/color] 这个最早好像是迅雷的面试题目吧,看到了然后就想重温一下这个题目的解决方法。 在本文中,给出了五种这个题目的解决方法: [list] [*][b]使用sleep [*]使用sync...
面试题--三个线程循环打印ABC 10次:另类解决方法
看到网上有各种写法,但总感觉的看起来晦涩难懂。于是自己写了一个,如下: import java.util.concurrent.atomic.AtomicBoolean; class Printer extends Thread { public AtomicBoolean canPrint; private String _text; private Printer _nextP
多线程交替打印ABC的多种实现方法
一、题目描述建立三个线程A、B、C,A线程打印10次字母A,B线程打印10次字母B,C线程打印10次字母C,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印。二、Synchronized同步法1、基本思路使用同步块和wait、notify的方法控制三个线程的执行次序。具体方法如下:从大的方向上来讲,该问题为三线程间的同步唤醒操作,主要的目的就是ThreadA->Thre
Java多线程循环打印ABC的5种实现方法
题目:3个线程循环打印ABC,其中A打印3次,B打印2次,C打印1次,循环打印2轮 一.Synchronized同步法 思路:使用synchronized、wait、notifyAll的方法利用线程标记变量控制三个线程的执行顺序。 /** * @author XDarker * 2018-5-17 */ public class Main { public static voi...
Java多线程1--三线程打印ABC
建立3个线程,A线程打印10次A,B线程打印10次B,C线程打印10次C,要求线程同时运行,交替打印10次ABC   import java.util.concurrent.TimeUnit; public class ThreadABC { public static void main(String[] args) throws InterruptedException ...
三个线程轮流执行顺序打印ABC(三):使用Lock实现
需求:有三个线程轮流执行,第一个线程打印A,第二个线程打印B,第三个线程打印C……循环10次。 思路:三个线程共享同一把锁、一个线程轮流状态state。线程拿到锁之后,通过state进行判断,如果轮到当前线程打印,则执行打印、更改state状态。每个线程都不停的循环,获取锁、判断state,执行打印,并……直到每个线程打印10次。 效率:由于三个线程不停的抢占锁,但是获取锁后不一定具备打印条件,所以
三个线程ABC,交替打印ABC
synchronized 问题为三线程间的同步唤醒操作,主要的目的就是ThreadA->ThreadB->ThreadC→ThreadA……循环执行三个线程。为了控制线程执行的顺序,那么就必须要确定唤醒、等待的顺序,所以每一个线程必须同时持有两个对象锁,才能继续执行。一个对象锁是prev,就是前一个线程所持有的对象锁。还有一个就是自身对象锁。 主要的思想就是,为了控制执行的顺序,必须要先持有p
C++ 11 三个线程打印ABC(顺序打印)
题目:有3个线程A,B, C, 请用多线程编程实现在屏幕上循环打印10次ABCABC..., 其中A线程打印“A”, B线程打印“B”, C线程打印“C”。 使用C++11 实做, 代码如下:
JAVA三个线程依次打印ABC
一、一些简单概述        多线程情形下对共享资源的访问是需要互斥的,比如对一个变量的读写,一个线程读写这个变量的时候,其它线程就不能对这个变量进行读写。Java提供了synchronized关键字来支持互斥,它既可以修饰需要访问共享资源的方法(称为同步方法),也可以直接包裹访问共享资源的代码块(称为同步块)。两种书写形式分别如下: //同步方法 public synchroniz
java多线程每个线程挨着打印ABC的4种实现方式
java多线程每个线程挨着打印ABC的4种实现方式,有4个线程t1、t2、t3、t4,t1打印A后t2打印A再t3打印A再t4打印A,然后从新回到t1打印B再t2打印B...t4打印B... 4个线程轮流打印abc... 一个线程可以理解为一个人,打印字母可以理解为走路 张三走一步然后李四走一步。。。所有人走完第一步后,又从张三开始走下一步。 里面一共有4中实现方式,实现线程间同步和通信问题,有synchronized实现也有ReentrantLock的实现,还有不用任何锁和同步的实现。欢迎大家一起交流,使用更多的方法来实现。
三个线程交替打印ABC
public class ABCLock { public static void main(String[] args){ //共用的对象,保证是同个锁 final PrintABC printABC= new PrintABC(); new Thread(new Runnable() { @Override
三个线程轮流执行顺序打印ABC(二):使用Lock+Condition实现
需求:有三个线程轮流执行,第一个线程打印A,第二个线程打印B,第三个线程打印C……循环10次。 思路:三个线程对应三个Condition,三个Condition共享一个Lock,一个线程轮流状态state。线程拿到锁之后,通过state进行判断,如果轮到当前线程打印,则执行打印、更改state状态以及通过下一个线程对应的Condition唤醒下一个线程;如果没有轮到当前线程打印,则通过当前线程对应
java-notify/wait写给自己看的 三个线程abc顺序打印
面试题 多线程轮流顺序打印 a,b,c三个线程按顺序打印数字1-96 线程a打印1,b打印2,c打印3 ......  具体的程序实现见如下连接 1.notify 必须放在 synchronized(obj){}代码块中   while(true) 挂一个循环体 synchronized(lock){     if(){         lock.notifyAll();     }else{...
三个线程轮流执行顺序打印ABC,依次是ABCABCABC......(三种方式)
1.使用synchronized悲观锁 (秋招阿里的一个笔试题,应该写的比较复杂,然后就没有然后了o(╥﹏╥)o) public class ThreadThreadp { private int flag = 0; public synchronized void printa() throws InterruptedException { while (tru...
Java三个线程循环打印
先上效果图:    目录 资源 测试 资源 这里用了condition 执行流程:线程1执行完,让线程2醒来工作;线程2执行完,让线程3醒来工作;线程3执行完,让线程1醒来工作 原理(都是按最坏的情况分析): ①一开始3个线程抢锁,如果线程2和3抢到锁,会进入等待(因为num=1),并释放锁,此时只有线程1可以拿锁 ②线程1开始执行,将num=2,并唤醒线程2,此时线程1和...
Java实现多线程经典问题:使用三个线程实现输出ABCABC循环
使用三个线程实现ABCABC……循环。 代码如下://标记类,用来让三个线程共享,同时也是三个线程中同步代码快的标记对象。 //之前这个标记我设置成Integer,但是发现Integer进行加法运算时会改变对 //象引用(原因是自动装箱),因此出现异常抛出。所以索性自己定义Flag类。 class Flag{ int i=0; public synchronized void s
多线程面试题:按ABC的顺序显示
笔试题:编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。 2017年03月21日 19:25:02 阅读数:712 这是最近笔试遇到一个多线程题,当时没有做出来,后来经过查找后,找到两种写法。 方法一:利用Lock和Condition来实现,代码如下 public c...
3个线程顺序打印ABC10次
今年,唯品会的一道笔试题当时写得很乱,也写错了,现在给出我的解决方法:package deadLockThread; public class PrintThread { private static boolean flga1 = true; private static boolean flga2 = false; private static boolean flga3 = fals
java多线程---顺序打印ABC的三种实现---ReentrantLock方式
使用jdk1.5并发包中引入的lock方式,这种方式使用比synchronized这种方式更加灵活,也提供了在获取锁时阻塞的办法 代码如下: package com.zcj.thread; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public
Java用三个线程按顺序循环打印 abc 三个字母,比如 abcabcabc。(再尝试)
    之前的文章(点击打开链接)中解决此问题使用的同步代码块,本次使用的线程安全类来顺序输出,并还能认识到一个Java异常和抛出异常的原因。    线程安全类代码:package JavaDay5_29; /** * @author myvina@qq.com * @date 18-5-29 上午10:28 */ public class PrintLetter { priv...
java多线程---顺序打印ABC的三种实现---join方法
使用join方法,让三个线程之间存在等待关系 代码如下: package com.zcj.join; public class JoinTest { public static void main(String[] args) { ThreadA threadA = new ThreadA(); ThreadB threadB = new ThreadB(threadA);
润和面试题:开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。 /***************************************************** copyright (C), 2014-2015, Lighting Studio. Co., Ltd. Fil
三个线程分别打印ABC,按顺序输出ABCABC...
#include #include #include #include #include #include using namespace std; pthread_mutex_t lockA; pthread_mutex_t lockB; pthread_mutex_t lockC; int i = 1; void* funA(void* args) { while(1
百度阿里经典面试题,三个线程按顺序执行
    想要在子线程中让三个线程按顺序执行,最核心的思想是让线程等待,等到线程执行完毕之后,再去执行下一条。 1:join()     幸好Thread.join()方法就是这种机制,join()的方法就是先等待,在线程执行完毕之后才会返回,翻看源码可以更清晰的看到这一点,         所以第一种的实现方法如下所示, public class JoinRealize { ...
Java多线程顺序打印abc的多种写法
Java多线程顺序打印abc的多种写法 问题描述: 有三个线程顺序打印abc十次,请用线程同步实现。 问题分析: 这个问题是一个线程同步的问题,一共打印十轮每一轮都要保证a,b,c三个线程顺序执行。本文给出以下几个常用方法。 CAS实现 package com.shu.yzy.thread; import java.util.concurrent.LinkedBlockingQueu...
java多线程:结合多线程交替打印10次abc实例,对wait/notify使用的彻底理解
接上篇:http://blog.csdn.net/wabiaozia/article/details/79429585 有个朋友看点击打开链接 里的三个线程“A线程打印10次A,B线程打印10次B,C线程打印10次C,要求线程同时运行,交替打印10次ABC。” 这个问题的代码,有点不太理解,让我给看下。不理解的原因也很简单,就是对wait和notify理解不深,遇到复杂点的场景会迷糊。对于并发相...
三个线程轮流执行顺序打印ABC(一):使用Semaphore实现
需求:有三个线程轮流执行,第一个线程打印A,第二个线程打印B,第三个线程打印C……循环10次。思路:三个线程对应三个Semaphore,三个Semaphore维护一个Permit。当前线程通过对应的Semaphore获取Permit,执行打印,并通过下一个线程对应的Semaphore释放Permit。类似于Permit在当前的线程对应的Semaphore中,传递到了下一个线程对应的Semaphore
使用synchronized和Condition三线程轮流打印A,B,C示例
ReentrantLock并不是一种替代内置加锁的方法,而是当内置加锁机制不适用时,作为一种可选择的高级功能。当需要一些高级功能时才使用ReentrantLock,包括定时的锁等待,可中断的锁等待,公平性,锁绑定多个条件以及实现非块结构的加锁。否则,还是应该优先使用内置锁synchronized。synchronized是JVM的内置特性,可以进行一些优化。比如对线程封闭锁对象的锁消除优化...
java多线程---顺序打印ABC的三种实现---synchronized方式
利用同步锁,这种方式存在问题就是唤醒的过程中不能指定我说需要唤醒的线程,导致同一个锁上的线程都唤醒了 代码如下: package com.zcj.thread; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class PrintABC
python多线程交替打印abc
还是元气满满的小黄鸭呀! 利用python线程的互斥锁可以把资源锁住,然后一个时间只让一个线程执行 关于缓冲区问题:使用 print 输出时会先把数据放到缓冲区里,只有当程序结束时或缓冲区遇到 \n 时,才将数据显示到屏幕,并清空缓冲区,而 print 函数默认会有 \n。 关于换行和缓冲区问题的详细解释:https://blog.csdn.net/yilovexing/article/de...
如何实现有三个线程a,b,c,这三个线程都有一个方法分别打印A、B、C,问怎么能实现依次打印ABC的功能
今天有家电面(具体哪家就不提了)问了这样的问题:如何实现有三个线程a,b,c,这三个线程都有一个方法分别打印A、B、C,问怎么能实现依次打印ABC的功能。当时想着使用优先级或者join方法(肯定不行,因为你定的优先级不太听话不会按照你定的去依次执行,join方法去抢占时间片也不好使),其实就是利用线程池去解决这个问题:思路:其实就是让三个线程依次运行,运用的是线程池来完成的,创建一个只有一个线程的...
1418作业(8)多线程 开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID 在屏幕上打印10遍
/****************************************************************************** *题目: 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID * 在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC…依次递推。 *************************
三个线程循环输出ABCABCABC....
题目: 三个线程,A线程输出A,B线程输出B,C线程输出C 然后这三个线程运行循环输出ABCABCABCABC...... 此题目考察的是线程的同步,多线程的控制 解决方案中主要用到了java中的sychronised, notify, wait notify和wait主要是为了控制线程,控制程序的执行流程 如果对象调用了wait方法就会使持有该对象的线
Java用三个线程按顺序循环打印 abc 三个字母,比如 abcabcabc。
这是一道经典的Java多线程面试题。自己写了一种较为巧妙的方法:package JavaDay5_27; import java.util.Collections; /** * @author myvina@qq.com * @date 18-5-27 下午8:00 */ public class Demo1 { public static void main(String[...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 大数据基础面试题 ios视频开发的面试题

相似问题

1
c++,CreateThread在类中使用,要如何声明线程函数呢
1
c++ 11 在局部使用async()创建一个线程,当程序运行出局部区域时,为什么代码会阻塞等待线程执行结束?
4
写了一个测试类 打算创建一些线程 同时加一个数,然后发觉同步不了,不知道为什么
0
将session绑定线程后,为什么手动关闭session不会报已关闭Session错误。
1
如何利用线程机制设计自己创意一个多道程序?
2
关于生产消费线程,消费者重复执行的问题
1
c语言中如何理解参数是从线程
4
asp.net 后台开线程写脚本提示异常“ 响应在此上下文中不可用”
0
C语言加壳为什么修改CONTEXT之后恢复线程时程序还是会崩溃?求大佬指点
1
loadrunner中的三个组件算是线程吗
6
下面的代码怎么修改,才能保证线程里不报空指针异常
10
线程之间的切换会消耗系统性能为啥还用多线程?
1
delphi 怎样在线程里添加NMUDP控件的onDataRecieved事件?
1
ThreadPoolExecutor添加线程不执行,为什么
2
c#中自定义控件控制线程时,两个控件间相互影响,怎么避免?
2
python pyqt5 怎样暂停和退出指定线程?
1
ReentrantLock(true)为什么公平锁仍然会出现一个线程连续获得锁的情况?
1
c# wpf窗体 线程问题
1
写一个死锁示例,创建两个线程的代码看不出什么问题但是在命令行运行时只输出了一个线程是怎么回事?
1
C# 中线程死亡后资源会被自动回收释放内存吗