我创建新线程并启动它。它的run方法有以下代码:
for (int a=0; a<10; a++) {
System.out.println(a);
Thread.sleep(10);
}
我得到的是:
0
0
1
1
2
0
2
3
1
0
3
4
2
1
0
4
5
3
2
1
0
5
6
4
......等等。为什么我没有得到1 2 3 4 5 6 7 8 9
?是什么原因?
修改
线程代码:
private class WarpEnemyRnn implements Runnable {
private WarpEnemy enemy;
public WarpEnemyRnn(WarpEnemy enemy) {
this.enemy = enemy;
}
@Override
public void run() {
try {
for (int a=0; a<8; a++) {
System.out.println(a);
enemy.subOpacity();
Thread.sleep(refreshRate);
}
Point2D warpPoint = enemy.warp();
enemy.setX((int) warpPoint.getX());
enemy.setY((int) warpPoint.getY());
enemy.resetWarpCooldown();
for (int a=0; a<8; a++) {
enemy.addOpacity();
Thread.sleep(refreshRate);
}
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
在另一个每15ms运行一次的线程中创建新线程。只有在某些条件达成一致时才会创建它。
答案 0 :(得分:11)
所有线程都打印到相同的标准输出。
每次看到0打印出来的时候都是创建一个新线程。
以下是你的主题:
0 1 2 3 4 5 6
0 1 2 3 4 5
0 1 2 3 4
0 1 2
0 1
0
每个人都按顺序打印数字。
注意 - 不能保证将每个输出分配给我指定的线程,这只是输出的一个可能的对齐方式(例如前两个线程的输出是可互换的),但时间表明这确实是正确的任务。
如果要查看哪个线程打印了什么,可以为每个线程添加唯一ID。
答案 1 :(得分:0)
在另一个每15ms运行一次的线程中创建新线程。只有在某些条件达成一致时才会创建它。
您尚未显示该代码,但我预计发生的情况是您正在创建并运行多个WarpEnemyRnn
实例。启动一个人的条件可能需要一个警卫,因为它已经已经解雇了一个。
答案 2 :(得分:0)
相同的资源:System.out
由所有线程共享。
如果你想看到正确的输出,你必须同步它,但这不是一个好习惯,因为它会降低并发性。
private class WarpEnemyRnn implements Runnable {
private WarpEnemy enemy;
public WarpEnemyRnn(WarpEnemy enemy) {
this.enemy = enemy;
}
@Override public void run() {
try {
synchronize( System.out) { //<<<<<<< HERE IS THE SYNCHRO
for (int a=0; a<8; a++) {
System.out.println(a);
}
}
for (int a=0; a<8; a++) {
enemy.subOpacity();
Thread.sleep(8*refreshRate);
}
...