-2

新しいスレッドを作成して開始します。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ごとに実行される他のスレッドで新しいスレッドが作成されます。何らかの条件が一致した場合にのみ作成されます。

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

それぞれが順番に番号を印刷しています。

注-各出力が指定したスレッドに割り当てられることは保証されていません。これは出力の可能な配置の1つにすぎません(たとえば、最初の2つのスレッドの出力は交換可能です)が、タイミングはこれが実際に正しい割り当てであることを示しています。

どのスレッドが何を印刷するかを確認したい場合は、各スレッドに一意のIDを追加できます。

于 2013-02-17T12:21:14.950 に答える
0

15msごとに実行される他のスレッドで新しいスレッドが作成されます。何らかの条件が一致した場合にのみ作成されます。

あなたはそのコードを示していませんが、何が起こっているのかは、複数のWarpEnemyRnnインスタンスを作成して実行していることだと思います。1つを起動するあなたの状態は、おそらくそれがすでに1つ起動されているかどうかの警備が必要です。

于 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 に答える