Java多线程同时启动或执行

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

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

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

以下方法显然不行:
[code="java"]
new CarThread().start();
new CarThread().start();
new CarThread().start();
...
...
[/code]
有先后顺序的话就保证不了准确性。

[color=gray]----------我要隔开我要隔开----------[/color]

aninfeel所回答的同样有问题:
[quote="aninfeel"]全部车子线程启动后使用wait(),然后使用notifyAll大家一起开动
[code="java"]
class CarThread{

public void run()

{

//大家一起在这里等。

synchronized(waitObj){

waitObj.wait();

}

//开始比赛

..........

}

}

//大家一起跑

waitObj.notifyAll();

[/code]
[/quote]
原因,Object.notifyAll()的javadoc说的很清楚。
[quote="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.
[/quote]
[b]问题补充:[/b]
继续补充一下:

没有看明白"墓里活人"的100毫秒10毫秒的回答....

其实 你没必要让线程一起启动,除非你有这么多的CPU 理论上是不行的。

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

全部车子线程启动后使用wait(),然后使用notifyAll大家一起开动
[code="java"]
class CarThread{
public void run()
{
//大家一起在这里等。
synchronized(waitObj){
waitObj.wait();
}
//开始比赛
..........
}
}

//大家一起跑
waitObj.notifyAll();
[/code]

那你只能控制 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决定。所以,所谓的公平应该是:各辆车启动的间隔尽可能小,并且启动顺序是随机的。

其实只要使用闭锁的实现就可以了啊CountDownLatch。
使用CountDownLatch signal = new CountDownLatch(1);
在线程中run方法使用signal.await()方法,然后需要启动是使用signal.countDown();

用CountDownLatch