为了账号安全,请及时绑定邮箱和手机立即绑定

细说多线程之Thread VS Runnable

难度初级
时长 1小时 0分
学习人数
综合评分9.63
171人评价 查看评价
9.8 内容实用
9.6 简洁易懂
9.5 逻辑清晰

最赞回答 / Angel若梦
你的代码有两处错误1.用继承Thread的方法实现多线程,需要new多个对象,这也是你在共享变量是加static的原因,所以,你使用的锁对象this是不同的对象,所以不能实现线程的互斥.可以使用该类的字节码对象Ticket.class作为锁对象.2.如果已经实现了互斥,你需要在同步代码块中增加一个判断条件,用来终止程序继续执行,否则会出现打印负数的情况.因为,  未获得锁的线程会在循环内等待,当一条线程将tickets--到0的时候,其他等待的线程获得锁以后会继续执行后续代码,导致运行结果不准确.

已采纳回答 / 鸿泽
可能是因为并非窗口1首先获得CPU时间片,而是其他线程。首先是窗口2 ,执行到count--之后,sysout时就被阻塞了。注意此时count=4。然后是窗口1 ,执行了整个run方法 ,此时count=3。然后是窗口3 ,执行了整个run方法 ,此时count=2。此时窗口2恢复,继count--之后执行,输出count=3。然后是窗口3 ,执行了整个run方法 ,此时count=0。当然这种并不一定是这样,因为现在的多核CPU线程是可以同时执行的。

最新回答 / 哀幻暝
<...图片...>补充一个解决办法

最新回答 / 飘游人
extends Thread的例子没有问题。想实现的确实是3个窗口总共有5张票,老师故意用extends Thread的例子,就是为了说明这种方式达不到希望的效果(即实际出现的效果是你所说的“每个窗口拥有5张票”)。老师也在PPT中写明,只有Runnable的方式才适合多个线程处理同一资源的情况。如果硬要用extends Thread来实现效果,确实像你说的可以加static关键字,但老师想告诉我们的是,对于这样的情况,还是用Runnable好。

已采纳回答 / ddyblack
查看老师的个人信息就可以看了啊

最新回答 / 无心水2012
共用一个变量,已经到0了,while条件就退出了。只会打印一个0.

最赞回答 / sxian_wang
你的理解大致上是对的,但不是刚好打印的时候被窗口2减去一张票,过程是这样的:当第一个线程获得CPU的时间片后,它的代码恰好执行到println那一行后,刚准备输出(但还没有获得tickets的值),这时候该线程的时间片被剥夺,等待下一次再获得时间片。等到别的线程执行完后,该线程再次获得时间片,它去访问tickets变量,应该tickets变量是被别的线程自减过得,所以获得不是4,而是一个比4小的值。由于这种运算在现在的CPU上很快,就会出现前三个都是2的情况。如果你给println语句加上一个synchr...

最新回答 / good_2016
If you see the additional message "Unable to attach to 32-bit process running under WOW64",    your application is running with 32bit Java while using 64bit Eclipse on Windows.    Either using 64bit Java for your application or using 32bit Eclipse solv...

已采纳回答 / 天启之魂
...........建议你再好好学习一下...这里主线程是指的main函数.......sc只是个对象....只是main线程中的一个代码而已...这里能看到的就两个线程 1个main线程 是主线程   一个是thread 线程. 设置成了守护线程...

已采纳回答 / 天启之魂
稍微说下 免得你误解 不是每个方法都有一个线程 而是 main函数是程序的入口,你运行java程序的时候就默认开启的是main线程 然后你有额外开启了一个thread0的线程 所以有两个线程罗!

最赞回答 / 哀幻暝
在这里一共有两个线程①.守护线程  ②主线程(main)  老师说的:若没有线程需要守护线程“守护”,那么守护线程就会退出程序运行之后两条线程都在执行:②线程再启动了①线程然后 继续执行到sc.next()语句 等待键盘输入①线程在启动之后就不停的写东西到文件中。如果在这之后的过程中,程序员在键盘中输入的任意字符,毁导致②继续执行,然后②就执行完啦,你看main方法中就那几行代码,全都执行完啦! 然后主线程就退出啦! 然后①线程就没有线程可以守护啦,自己也就退出啦!

最赞回答 / 剪忉手
继承thread类和实现runnable接口本身就没有什么可比性。两者根部就不是同一类东西一个是接口,另一个是继承类且这个thread类也是继承了Runnable接口的。两者不同在于方法的实现不同,我也可以在继承thread类里写runnable的方法。再有就是java单继承的劣势,这点上Runnable会更好些。

最新回答 / lmk_andriod
小哥,我回答的怎么样,一定要给我一个最佳答案哦  嘿嘿

最新回答 / 慕斯卡6635957
  final NioSocketConnector connector = getConnector();        connector.getFilterChain().addLast("transportCoder",                new ProtocolCodecFilter(new CustomProtocolCodecFactory(Charset.forName("UTF-8"))));        connector.getSessionConfig().setRe...
课程须知
学习本课程前,你需要熟练掌握Java的基础语法,熟悉Java中创建线程的两种方式,熟悉Java多线程中常用的一些方法。
老师告诉你能学到什么?
1、多线程创建方式的比较和选择 2、线程的生命周期、守护线程

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!

本次提问将花费2个积分

你的积分不足,无法发表

为什么扣积分?

本次提问将花费2个积分

继续发表请点击 "确定"

为什么扣积分?

举报

0/150
提交
取消