多线程买票问题

vershala 2017-07-26 03:22:59
个人学习了一个多线程卖票的程序,可是模拟结果总是不对,希望有大大帮忙看看什么原因

private int num=100;
private int i=0;
private synchronized void sale(){
if(num>0){
num--;
i++;
System.out.println(Thread.currentThread().getName()+"卖出了第"+i+"张票,还剩余"+num+"票!");
try{
Thread.sleep(10);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}

@Override
public void run() {
while(num>0){
sale();
}
}
@Test
public void test() {
Seller st = new Seller();
for(int i=1; i<=5; i++) {
new Thread(st, "售票点" + i).start();
}
}

public static void main(String[] args){
Seller st = new Seller();
for(int i=1; i<=5; i++) {
new Thread(st, "售票点" + i).start();
}
}

以下是junit运行结果,运行结果明显不正确

而使用main方法测试时发,结果就正确了
...全文
213 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
我爱兔宝宝 2017-07-27
  • 打赏
  • 举报
回复
原因: 1. main方法执行时, 主线程退出后, JVM会在非守护线程都结束后退出 2. junit用例执行时,主线程退出时,及终止了JVM进程 可以在test()方法最后sleep下,或者用thread.join方法、countdownlath、cyclicbarrier方式,让主线程等待其它线程结束,再退出

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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