2016-11-19 11 views
0

私はJavaのスレッドをテストするための小さなプログラムを作成しました。 問題は、私が予測したように結果を得ることができないことです:毎回100レコード。 私はレコード数がランダムです。と私はこの行のコメントを削除した後:Javaスレッドコレクションへのデータ出力に間違った結果が出ました

//System.out.println(名前+ "完了"。);

私は毎回100レコードを予測しています。 つまり、System.out.println()を追加すると、すべてが完璧に機能します。 これはJavaのバグか気付かなかったものですか?あなたは、ArrayListに同じpositonに2つのthreads書き込みデータ:

MyThread.java

public class MyThread extends Thread { 

    @Override 
    public void run() { 

    String name = Thread.currentThread().getName(); 

    for (int i = 1; i <= 10; i++) { 
     if (i == 10) { 
     //System.out.println(name + " Completed."); 
     TestThread.al.add(name); 
     } 
    } 

    } 

} 

TestThread.java

import java.util.ArrayList; 

public class TestThread { 

    public static ArrayList<String> al = new ArrayList<String>(); 

    public static void main(String[] args) throws Exception { 

    ArrayList<MyThread> mt = new ArrayList<MyThread>(); 

    //set 
    for (int i = 0; i < 100; i++) { 
     mt.add(new MyThread()); 
     mt.get(i).setName("Worker " + (i + 1)); 
    } 

    //start 
    for (int i = 0; i < 100; i++) { 
     mt.get(i).start(); 
    } 

    //end 
    for (int i = 0; i < 100; i++) { 
     mt.get(i).join(); 
    } 

    //result 
    for (int i = 0; i < al.size(); i++) { 
     System.out.println("Rank " + (i+1) + " : " + al.get(i)); 
    } 

    } 

} 
+0

私は、100行すべてのコメント付きの行とコメント付きの行がなくなりました。行のコメントを外すと、違いはランダムです。 – dkb

+0

Vectorを使用した後、私は100のレコードとランダムな順序を持っています。スレッドテストは成功しました。 :) – Frank

答えて

3

は、ArrayListのがthread-safeはありませんが、多分ケースが存在しますスレッドセーフであるため、Vectorを代わりに使用できます。 here

+0

ありがとう。 Vectorを使用した後、私は毎回100レコードを取得しました。 – Frank

0

cainiaofeiはそれに答え、より多くのいくつかのポイントを追加したいた来thread-safeの詳細については、

:それはアクセスされているよう

あなたArrayListオブジェクトalは、読み込み(問題の原因となっています/複数のスレッドで並行してを書き込みます。

あなたは基本的な点を以下知っておく必要があります。多くのスレッドが同時にオブジェクトにアクセスするたびに、あなたがCollections.synchronizedList()(これを好む)またはVectorのようなスレッド・セーフ・クラスを使用する必要があることを確認してください

を。

プリミティブ型のスレッドセーフティが必要な場合は、JDKのアトミックパッケージを使用できます。そのためには、hereと表示されます。

+0

ありがとうございます。今私は同期メソッドについてもっと知っています。 – Frank

関連する問題