-2

我创建新线程并启动它。它的运行方法有以下代码:

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();
        }
    }
}

新线程在其他线程中创建,每 15 毫秒运行一次。只有在某些条件一致时才会创建它。

4

3 回答 3

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。

于 2013-02-17T12:21:14.950 回答
0

新线程在其他线程中创建,每 15 毫秒运行一次。只有在某些条件一致时才会创建它。

您尚未显示该代码,但我预计正在发生的事情是您正在创建和运行多个WarpEnemyRnn实例。您启动一个启动的条件可能需要一个警卫,以确定它是否已经启动了一个。

于 2013-02-17T12:21:33.940 回答
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);
           }
           ...
于 2013-02-17T12:26:58.453 回答