一个JAVA线程问题

qq_31134691 2015-10-03 08:20:19
代码如下:(问题在运行结果那里)
-----------------------------------------------------------------------------------------------------------------------------------
class MyThread implements Runnable {
private int ticket = 5;

public void run() {
for (int i = 0; i < 5; ++i) {
//synchronized (this) {
if (ticket > 0) {
try {
//Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}

System.out.println(Thread.currentThread().getName() + "卖票: ticket = " + (ticket--));
}
//}
}
}
}

public class Test2 {
public static void main(String[] agrs) {
MyThread mt = new MyThread();
Thread t1 = new Thread(mt);
Thread t2 = new Thread(mt);
Thread t3 = new Thread(mt);

t1.start();
t2.start();
t3.start();
}
}

一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一
运行结果却是:
------------------------------------------------------------------------------------------------------------------------------------------
Thread-1卖票: ticket = 3
Thread-2卖票: ticket = 5 //怎么5会在3的下面?
Thread-0卖票: ticket = 4
Thread-0卖票: ticket = 2
Thread-1卖票: ticket = 2
Thread-2卖票: ticket = 2
Thread-2卖票: ticket = 1
Thread-1卖票: ticket = 1
Thread-0卖票: ticket = 0
...全文
87 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
kswslwxlhb123 2015-10-06
  • 打赏
  • 举报
回复
并发问题 切换
qq_31134691 2015-10-06
  • 打赏
  • 举报
回复
但是像是这样的结果又如何解释呢? Thread-1卖票: ticket = 3 Thread-2卖票: ticket = 4 Thread-0卖票: ticket = 4 像上面这样 同时都是4的情况
qq_31134691 2015-10-06
  • 打赏
  • 举报
回复
引用 3 楼 zkwniky 的回复:
Thread-1卖票: ticket = 3 Thread-2卖票: ticket = 5 Thread-0卖票: ticket = 4 线程2 先进入函数 并且在准备好输出前(system.out.println 函数里面的参数已经准备完毕) 时间片 被线程0抢走 线程0 在输出(system.out.println 函数里面的参数已经准备完毕)前, 时间片被线程1 抢走 ,执行线程1 输出3 , 然后线程2 顺利得到时间片,输出5 线程0得到时间片 输出4
原来是这样的过程,略懂一点儿了
funnyone 2015-10-04
  • 打赏
  • 举报
回复
并发问题。 先执行Thread.currentThread().getName() + "卖票: ticket = " + (ticket--),之后可能当前线程挂起,执行另一个的该代码,这样就会导致小值在前面。你每次执行结果可能都不一样。
zkwniky 2015-10-04
  • 打赏
  • 举报
回复
Thread-1卖票: ticket = 3 Thread-2卖票: ticket = 5 Thread-0卖票: ticket = 4 线程2 先进入函数 并且在准备好输出前(system.out.println 函数里面的参数已经准备完毕) 时间片 被线程0抢走 线程0 在输出(system.out.println 函数里面的参数已经准备完毕)前, 时间片被线程1 抢走 ,执行线程1 输出3 , 然后线程2 顺利得到时间片,输出5 线程0得到时间片 输出4
scmod 2015-10-04
  • 打赏
  • 举报
回复
//synchronized (this) {}这个被你注释掉了啊原来....

50,542

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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