对于多线程中的循环不能正常工作

时间:2013-02-17 12:11:07

标签: java multithreading

我创建新线程并启动它。它的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运行一次的线程中创建新线程。只有在某些条件达成一致时才会创建它。

3 个答案:

答案 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);
           }
           ...