请教一个java线程问题,同样程序不同电脑结果不同

[复制链接]
查看11 | 回复8 | 2021-1-27 06:32:09 | 显示全部楼层 |阅读模式
publicclassSiteimplementsRunnable{
privateintcount=10;
privateintnum=0;
privatebooleanflag=false;

@Override
publicvoidrun(){
while(!flag){
sale();
}
}
publicsynchronizedvoidsale(){
if(count -->
回复

使用道具 举报

千问 | 2021-1-27 06:32:09 | 显示全部楼层
三个线程。并发执行,谁抢到CPU的时间片,谁就先执行。start()方法只是准备就绪,并未真正运行,需要抢到CPU时间片的才能真正开始运行。
回复

使用道具 举报

千问 | 2021-1-27 06:32:09 | 显示全部楼层
正常的运行结果应该是三个都能抢到的吧
桃跑跑抢到第1张票,剩余9张票!
抢票代理抢到第2张票,剩余8张票!
黄牛党抢到第3张票,剩余7张票!
抢票代理抢到第4张票,剩余6张票!
桃跑跑抢到第5张票,剩余5张票!
抢票代理抢到第6张票,剩余4张票!
黄牛党抢到第7张票,剩余3张票!
抢票代理抢到第8张票,剩余2张票!
桃跑跑抢到第9张票,剩余1张票!
抢票代理抢到第10张票,剩余0张票!
https://www.cnblogs.com/vinozly/p/5081521.html
回复

使用道具 举报

千问 | 2021-1-27 06:32:09 | 显示全部楼层
在sale()后面加个sleep
回复

使用道具 举报

千问 | 2021-1-27 06:32:09 | 显示全部楼层
我知道这个方法,但不知道为什么别的电脑上运行不加这个sleep也没问题。
回复

使用道具 举报

千问 | 2021-1-27 06:32:09 | 显示全部楼层
实现多个线程交替运行,就得谈到线程的通信。
线程的通信有三个方法:wait()notify()notifyAll()
wait():令当前线程挂起并放弃CPU、同步资源,使别的线程可访问并修改共享资源,而当前线程排队等候再次对资源的访问
notify():唤醒正在排队等待同步资源的线程中优先级最高者结束等待
notifyAll():唤醒正在排队等待资源的所有线程结束等待
在sale()方法中首行添加notify();
末行添加wait();
就实现多个线程交替运行。如下代码:
publicsynchronizedvoidsale(){
notify();
if(count引用1楼mq751902468的回复:三个线程。并发执行,谁抢到CPU的时间片,谁就先执行。start()方法只是准备就绪,并未真正运行,需要抢到CPU时间片的才能真正开始运行。理论上synchronized修饰的sale()方法运行结束后其他线程有机会抢到CPU的时间片,但实际上始终只有一个线程在运行,其他线程没有运行的机会,我可以理解为sale()运行完后线程分配到的时间片没用完,线程继续运行又进入了synchronized修饰的sale()方法,所以其他线程没有运行的机会,但问题是,这个程序在其他电脑上运行就没有问题,实现了多线程交替运行。
回复

使用道具 举报

千问 | 2021-1-27 06:32:09 | 显示全部楼层
桃跑跑抢到第1张票,剩余9张票!
黄牛党抢到第2张票,剩余8张票!
抢票代理抢到第3张票,剩余7张票!
抢票代理抢到第4张票,剩余6张票!
抢票代理抢到第5张票,剩余5张票!
抢票代理抢到第6张票,剩余4张票!
抢票代理抢到第7张票,剩余3张票!
抢票代理抢到第8张票,剩余2张票!
黄牛党抢到第9张票,剩余1张票!
桃跑跑抢到第10张票,剩余0张票!
----结果都正常,纠结没啥意思

回复

使用道具 举报

千问 | 2021-1-27 06:32:09 | 显示全部楼层
是不是你这个电脑cpu是单核单线程,其他的电脑是多核多线程?
回复

使用道具 举报

千问 | 2021-1-27 06:32:09 | 显示全部楼层
如果你在原电脑没错,而新电脑错了。
那么证明只有一点,你的逻辑错了,因为万码基于CPU的原理,
由于你之前的CPU性能差,你的思路太过狭隘,所以才会导致你的逻辑错误,这是很正常的,你经验累积的不够。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行