最赞回答 / Angel若梦
你的代码有两处错误1.用继承Thread的方法实现多线程,需要new多个对象,这也是你在共享变量是加static的原因,所以,你使用的锁对象this是不同的对象,所以不能实现线程的互斥.可以使用该类的字节码对象Ticket.class作为锁对象.2.如果已经实现了互斥,你需要在同步代码块中增加一个判断条件,用来终止程序继续执行,否则会出现打印负数的情况.因为, 未获得锁的线程会在循环内等待,当一条线程将tickets--到0的时候,其他等待的线程获得锁以后会继续执行后续代码,导致运行结果不准确.
2016-03-13
已采纳回答 / 鸿泽
可能是因为并非窗口1首先获得CPU时间片,而是其他线程。首先是窗口2 ,执行到count--之后,sysout时就被阻塞了。注意此时count=4。然后是窗口1 ,执行了整个run方法 ,此时count=3。然后是窗口3 ,执行了整个run方法 ,此时count=2。此时窗口2恢复,继count--之后执行,输出count=3。然后是窗口3 ,执行了整个run方法 ,此时count=0。当然这种并不一定是这样,因为现在的多核CPU线程是可以同时执行的。
2016-03-12
最新回答 / 飘游人
extends Thread的例子没有问题。想实现的确实是3个窗口总共有5张票,老师故意用extends Thread的例子,就是为了说明这种方式达不到希望的效果(即实际出现的效果是你所说的“每个窗口拥有5张票”)。老师也在PPT中写明,只有Runnable的方式才适合多个线程处理同一资源的情况。如果硬要用extends Thread来实现效果,确实像你说的可以加static关键字,但老师想告诉我们的是,对于这样的情况,还是用Runnable好。
2016-02-16
最赞回答 / sxian_wang
你的理解大致上是对的,但不是刚好打印的时候被窗口2减去一张票,过程是这样的:当第一个线程获得CPU的时间片后,它的代码恰好执行到println那一行后,刚准备输出(但还没有获得tickets的值),这时候该线程的时间片被剥夺,等待下一次再获得时间片。等到别的线程执行完后,该线程再次获得时间片,它去访问tickets变量,应该tickets变量是被别的线程自减过得,所以获得不是4,而是一个比4小的值。由于这种运算在现在的CPU上很快,就会出现前三个都是2的情况。如果你给println语句加上一个synchr...
2015-12-19
最新回答 / 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...
2015-12-02
已采纳回答 / 天启之魂
...........建议你再好好学习一下...这里主线程是指的main函数.......sc只是个对象....只是main线程中的一个代码而已...这里能看到的就两个线程 1个main线程 是主线程 一个是thread 线程. 设置成了守护线程...
2015-12-02
已采纳回答 / 天启之魂
稍微说下 免得你误解 不是每个方法都有一个线程 而是 main函数是程序的入口,你运行java程序的时候就默认开启的是main线程 然后你有额外开启了一个thread0的线程 所以有两个线程罗!
2015-11-22
最赞回答 / 哀幻暝
在这里一共有两个线程①.守护线程 ②主线程(main) 老师说的:若没有线程需要守护线程“守护”,那么守护线程就会退出程序运行之后两条线程都在执行:②线程再启动了①线程然后 继续执行到sc.next()语句 等待键盘输入①线程在启动之后就不停的写东西到文件中。如果在这之后的过程中,程序员在键盘中输入的任意字符,毁导致②继续执行,然后②就执行完啦,你看main方法中就那几行代码,全都执行完啦! 然后主线程就退出啦! 然后①线程就没有线程可以守护啦,自己也就退出啦!
2015-11-11
最赞回答 / 剪忉手
继承thread类和实现runnable接口本身就没有什么可比性。两者根部就不是同一类东西一个是接口,另一个是继承类且这个thread类也是继承了Runnable接口的。两者不同在于方法的实现不同,我也可以在继承thread类里写runnable的方法。再有就是java单继承的劣势,这点上Runnable会更好些。
2015-11-02
最新回答 / 慕斯卡6635957
final NioSocketConnector connector = getConnector(); connector.getFilterChain().addLast("transportCoder", new ProtocolCodecFilter(new CustomProtocolCodecFactory(Charset.forName("UTF-8")))); connector.getSessionConfig().setRe...
2015-08-22