Java多线程同时启动或执行

例如一个赛车游戏,里面有10辆车,我需要他们同时动起来,这个同时很重要,要求准确性非常高,因为只有每辆台车能同时开动,才算公平。

每辆车用一个线程表示,那么,这10个线程如何保证“同时启动、执行、唤醒...等等”的准确性呢?

请各位给出实现或思路,尤其是开发游戏的javaeyer...
问题补充:
补充一下:

以下方法显然不行:

Java代码 复制代码
  1. new CarThread().start();   
  2. new CarThread().start();   
  3. new CarThread().start();   
  4. ...   
  5. ...  
new CarThread().start();
new CarThread().start();
new CarThread().start();
...
...


有先后顺序的话就保证不了准确性。

----------我要隔开我要隔开----------

aninfeel所回答的同样有问题:

aninfeel 写道
全部车子线程启动后使用wait(),然后使用notifyAll大家一起开动
Java代码 复制代码
  1. class CarThread{     
  2.    public void run()     
  3.    {     
  4.       //大家一起在这里等。     
  5.       synchronized(waitObj){     
  6.            waitObj.wait();     
  7.       }     
  8.       //开始比赛     
  9.       ..........     
  10.    }     
  11. }     
  12.      
  13. //大家一起跑     
  14. waitObj.notifyAll();    
class CarThread{  
   public void run()  
   {  
      //大家一起在这里等。  
      synchronized(waitObj){  
           waitObj.wait();  
      }  
      //开始比赛  
      ..........  
   }  
}  
  
//大家一起跑  
waitObj.notifyAll();  


原因,Object.notifyAll()的javadoc说的很清楚。

javadoc 写道

The awakened threads  will compete in the usual manner with any other threads that might  be actively competing to synchronize on this object; for example, the awakened threads enjoy no reliable privilege or disadvantage in being the next thread to lock this object.

采纳的答案

2008-12-22 fjlyxx (中级程序员)
其实  你没必要让线程一起启动,除非你有这么多的CPU 理论上是不行的。

你在乎的就是时间,靠时间去判断,你可以在线程启动的时候设置一个开始时间,结束的时候一个结束时间。当然你的显示方式要能欺骗玩游戏的人。

提问者对于答案的评价:
还是那一句,分只能给一个。我闭着眼睛点“采纳为答案”,点了好几次才点中。

大家给出的答案都very well...

也想通了为什么赛车类的游戏都是要倒数3秒才开始。。

其他回答

全部车子线程启动后使用wait(),然后使用notifyAll大家一起开动
Java代码 复制代码
  1. class CarThread{   
  2.    public void run()   
  3.    {   
  4.       //大家一起在这里等。   
  5.       synchronized(waitObj){   
  6.            waitObj.wait();   
  7.       }   
  8.       //开始比赛   
  9.       ..........   
  10.    }   
  11. }   
  12.   
  13. //大家一起跑   
  14. waitObj.notifyAll();  

那你只能控制 10个线程 cup分配的运行时间了。

10个线程时间类。 规定在 多少多少毫秒内为一单位~

比如100毫秒。

哪么100毫秒内,10个线程每个应分配得10豪秒的运行时间。

在100豪秒内,有个别线程占用的大部分CUP时间。所以你可以写一个控制类
控制100毫秒内 每一条线程必须执行到10毫秒。才保证公平,
下一轮是另一个100毫秒开始。

如果你想高精确度的话 哪么可以调当前的100毫秒时间单位,改成更小的时间。

 

 

楼上的回答是正确的, 但是没有精确的东西。 除非你有32个CPU的系统, 哈哈啊哈

 

楼主应该先去研究下 java 的多线程,有点概念后再来讨论就容易很多。我来帮 墓里活人 解释下。

首先, 从技术上来说,严格意义上的同时启动是做不到的,除非你有多个cpu.
在大多数只有一个cpu的电脑上, 微观上同一时间内只有一个线程能运行。 那个为了达到近似你所要求的效果,可以采用变通的方法。

举例如下
你有10台赛车,这次赛车一共要持续10分钟。 但是只有一个cpu就类似只有一个赛道。 那怎么办呢? 可以每次每辆赛车跑10分钟。 然后换车。

为了做的更平滑点,可以每次每辆车跑1分钟,然后换车。

墓里活人  的解释就是这个意思。

不过在具体java 编程中,这个要求比较难实现, 因为java的线程调度的具体实现是依赖操作系统的。 我建议你可以换一种思路,就是每隔一分钟挨个计算一下各个车的位置。这种做法应该更实际。


"每辆台车能同时开动,才算公平" 是不现实的。因为实际上所谓的线程并发执行在微观上也是每个线程分一个小时间片,一个一个顺序执行。
换个角度,假设有一个方法可以同时启动所有的线程,线程启动后谁先执行也是由cpu决定。所以,所谓的公平应该是:各辆车启动的间隔尽可能小,并且启动顺序是随机的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值