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

不佑天 2017-11-09 08:12:00
public class Site implements Runnable {
private int count = 10;
private int num = 0;
private boolean flag = false;


@Override
public void run() {
while(!flag){
sale();
}
}

public synchronized void sale(){
if(count<=0){
flag = true;
return;
}
num++;
count--;
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"抢到第"+num+"张票,剩余"+count+"张票!");
}

}


public class Test {

public static void main(String[] args) {
Site site = new Site();
Thread person1 = new Thread(site,"桃跑跑");
Thread person2 = new Thread(site,"抢票代理");
Thread person3 = new Thread(site,"黄牛党");
person1.start();
person2.start();
person3.start();
}

}
这个程序运行结果是:

抢票代理抢到第1张票,剩余9张票!
抢票代理抢到第2张票,剩余8张票!
抢票代理抢到第3张票,剩余7张票!
抢票代理抢到第4张票,剩余6张票!
抢票代理抢到第5张票,剩余5张票!
抢票代理抢到第6张票,剩余4张票!
抢票代理抢到第7张票,剩余3张票!
抢票代理抢到第8张票,剩余2张票!
抢票代理抢到第9张票,剩余1张票!
抢票代理抢到第10张票,剩余0张票!

反正是不能实现多个线程交替运行,但是在另一台电脑上就能实现多线程交替运行,jdk和系统版本是一样的,难道和cpu有关系?
...全文
526 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
u010496857 2017-11-15
  • 打赏
  • 举报
回复
是不是你这个电脑cpu是单核单线程,其他的电脑是多核多线程?
  • 打赏
  • 举报
回复
如果你在原电脑没错,而新电脑错了。 那么证明只有一点,你的逻辑错了,因为万码基于CPU的原理, 由于你之前的CPU性能差,你的思路太过狭隘,所以才会导致你的逻辑错误,这是很正常的,你经验累积的不够。
guohezhibingzu 2017-11-12
  • 打赏
  • 举报
回复
桃跑跑抢到第1张票,剩余9张票! 黄牛党抢到第2张票,剩余8张票! 抢票代理抢到第3张票,剩余7张票! 抢票代理抢到第4张票,剩余6张票! 抢票代理抢到第5张票,剩余5张票! 抢票代理抢到第6张票,剩余4张票! 抢票代理抢到第7张票,剩余3张票! 抢票代理抢到第8张票,剩余2张票! 黄牛党抢到第9张票,剩余1张票! 桃跑跑抢到第10张票,剩余0张票! ----结果都正常,纠结没啥意思
不佑天 2017-11-09
  • 打赏
  • 举报
回复
引用 1 楼 mq751902468 的回复:
三个线程。并发执行,谁抢到CPU的时间片,谁就先执行。start()方法只是准备就绪,并未真正运行,需要抢到CPU时间片的才能真正开始运行。
理论上synchronized 修饰的sale()方法运行结束后其他线程有机会抢到CPU的时间片,但实际上始终只有一个线程在运行,其他线程没有运行的机会,我可以理解为sale()运行完后线程分配到的时间片没用完,线程继续运行又进入了synchronized 修饰的sale()方法,所以其他线程没有运行的机会,但问题是,这个程序在其他电脑上运行就没有问题,实现了多线程交替运行。
昨夜的雨 2017-11-09
  • 打赏
  • 举报
回复
实现多个线程交替运行,就得谈到线程的通信。 线程的通信有三个方法:wait() notify() notifyAll() wait():令当前线程挂起并放弃CPU、同步资源,使别的线程可访问并修改共享资源,而当前线程排队等候再次对资源的访问 notify():唤醒正在排队等待同步资源的线程中优先级最高者结束等待 notifyAll ():唤醒正在排队等待资源的所有线程结束等待 在sale()方法中首行添加 notify(); 末行添加 wait(); 就实现多个线程交替运行。如下代码: public synchronized void sale(){ notify(); if(count<=0){ flag = true; return; } num++; count--; try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"抢到第"+num+"张票,剩余"+count+"张票!"); } wait(); }
不佑天 2017-11-09
  • 打赏
  • 举报
回复
我知道这个方法,但不知道为什么别的电脑上运行不加这个sleep也没问题。
逗比123号 2017-11-09
  • 打赏
  • 举报
回复
在sale()后面加个sleep
自由自在_Yu 2017-11-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
mq751902468 2017-11-09
  • 打赏
  • 举报
回复
三个线程。并发执行,谁抢到CPU的时间片,谁就先执行。start()方法只是准备就绪,并未真正运行,需要抢到CPU时间片的才能真正开始运行。

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧