2013-02-17 231 views
-2

我創建新線程並啓動它。它的運行方法有以下代碼:For循環在多線程中無法正常工作

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?什麼原因?

編輯:

線程代碼:在那裏每15ms的其他線程創建

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

新線程。只有在某些條件同意時才創建。

+5

沒有顯示您的代碼的多線程部分,您將無法獲得具體的答案。但似乎你正在開始幾個交叉執行的線程。 – assylias 2013-02-17 12:12:24

+2

你能展示更多的代碼嗎?特別是你創建你的線程的地方,以及這個for循環的地方是什麼? – 2013-02-17 12:12:39

+0

是的等一下 – user2080377 2013-02-17 12:13:40

回答

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。

+4

+1做得很漂亮。 – 2013-02-17 12:23:22

0

新線程創建在其他每15ms運行的線程中。只有在某些條件同意時才創建。

您還沒有顯示該代碼,但我預計發生的事情是您正在創建並運行多個WarpEnemyRnn實例。你的條件,啓動一個起來可能需要警惕是否已經開了一個。

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); 
      } 
      ... 
+0

在System.out上同步是一個非常糟糕的主意。 – Perception 2013-02-17 12:27:35

+0

是的,正如我寫的 – Aubin 2013-02-17 12:27:48

+0

@Aubin如果你知道,爲什麼要這樣做而不使用別的東西? – assylias 2013-02-17 12:29:19