多线程订票问题??为什么加了延时结果就正确了?? synchronized 同步嘛一次只有一个 你自己也写了 前边的不睡 后边怎么进去啊 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 线程需要时间切换如果一直占着CPU另外一根线程就无法的到CPU时间来运行 才10张票一下子就完了,不用sleep哪来线程转换 不是这样的。即使在main线程里不调sleep,线程调度仍然会发生的。楼主说的结果不正确是什么意思? 你的程序本身有严重问题, 另外不能靠延时来调度线程,特别是1ms不通机器上或允许多次可能有不通结果错误在这里 m.booking(2); // 执行后线程没启出来,假设叫Th1 m.booking(2); // 执行后线程没启出来,叫Th2 m.booking(4); // 执行后线程没启出来,叫Th3 // 此时ThreadBook的num为4!!! Th1启动了,订票4张: 还剩下6 张 Th2启动了,订票4张: 还剩下2 张 Th3启动了,订票4张: 无法预定所需票数 在任何时间点上占用cpu的线程是唯一的也是不确定的 milkslzz(网络小毛虫) 正解 m.booking(2); //这时,m.num为2,但th1.run()很可能还没有运行。如果主线程sleep, //那th1.run就运行并调用了b.booking(2); m.booking(2); //这时,m.num为2,但th2.run()很可能还没有运行。如果主线程sleep, //那th2.run就运行并调用了b.booking(2); m.booking(4); //这时,m.num为4,但th3.run()很可能还没有运行。如果主线程sleep, //那th3.run就运行并调用了b.booking(4); 如果这时,th1,th2,th3才得到调度,那么它们的run方法里面调用b.booking(num)时,num都是4; 一个解决办法:改一下构造函数和booking方法。Threadbook(BookingTicket b,int num) {this.b=b;this.num = num;}public void static booking(BookingTicket b,int num) { new Threadbook(b,num).start(); }main()里面这样调:BookingTicket b=new BookingTicket();Threadbook.booking(b,2);Threadbook.booking(b,2);Threadbook.booking(b,4);就ok了关键在于你的代码里三个线程共用一个Threadbook对象,从而共用了同一个num。产生了执行结果依赖于线程调度过程的错误结果。 系统异常处理 java下载问题。 怎么让SWT shell一产生就让它一直失去 键盘焦点(窗口焦点) 完全数如何用编程语言实现? 程序溢出问题 问个小问题 想做软件开发,先做软件测试可以么? 使用java中的什么控件可以完成这个功能——java构件高手请进 50分 java 连接 mysql数据库问题!!!!! JTable的数据显示问题 [提问]如何用JTable实现类似(JdbTable和JdbTextField同步)的功能? 如何直接对数据库存取图片
如果一直占着CPU
另外一根线程就无法的到CPU时间来运行
即使在main线程里不调sleep,线程调度仍然会发生的。楼主说的结果不正确是什么意思?
不通机器上或允许多次可能有不通结果错误在这里
m.booking(2); // 执行后线程没启出来,假设叫Th1
m.booking(2); // 执行后线程没启出来,叫Th2
m.booking(4); // 执行后线程没启出来,叫Th3
// 此时ThreadBook的num为4!!! Th1启动了,订票4张: 还剩下6 张
Th2启动了,订票4张: 还剩下2 张
Th3启动了,订票4张: 无法预定所需票数
占用cpu的线程是唯一的
也是不确定的
m.booking(2); //这时,m.num为2,但th1.run()很可能还没有运行。如果主线程sleep,
//那th1.run就运行并调用了b.booking(2);
m.booking(2); //这时,m.num为2,但th2.run()很可能还没有运行。如果主线程sleep,
//那th2.run就运行并调用了b.booking(2);
m.booking(4); //这时,m.num为4,但th3.run()很可能还没有运行。如果主线程sleep,
//那th3.run就运行并调用了b.booking(4); 如果这时,th1,th2,th3才得到调度,那么它们的run方法里面调用b.booking(num)时,num都是4;
一个解决办法:
改一下构造函数和booking方法。Threadbook(BookingTicket b,int num)
{
this.b=b;
this.num = num;
}
public void static booking(BookingTicket b,int num)
{
new Threadbook(b,num).start();
}main()里面这样调:
BookingTicket b=new BookingTicket();
Threadbook.booking(b,2);
Threadbook.booking(b,2);
Threadbook.booking(b,4);就ok了
关键在于你的代码里三个线程共用一个Threadbook对象,从而共用了同一个num。产生了执行结果依赖于线程调度过程的错误结果。