私は両方ともベクトルにアクセスする2つのスレッドを持っています。 t1は乱数を追加し、t2は最初の数を削除して出力します。以下はコードと出力です。 t2は1回だけ(t1が始まる前に)実行され、永遠に終了します。私はここに何かを逃していますか(PS:同様のArrayListでテスト済み)2つのスレッドを持つベクトル(またはArrayList)への書き込み/読み込み
import java.util.Random;
import java.util.Vector;
public class Main {
public static Vector<Integer> list1 = new Vector<Integer>();
public static void main(String[] args) throws InterruptedException {
System.out.println("Main started!");
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("writer started! ");
Random rand = new Random();
for(int i=0; i<10; i++) {
int x = rand.nextInt(100);
list1.add(x);
System.out.println("writer: " + x);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("reader started! ");
while(!list1.isEmpty()) {
int x = list1.remove(0);
System.out.println("reader: "+x);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
t2.start();
t1.start();
t1.join();
t2.join();
}
} 出力: メインが開始! リーダーが開始!作家開始! ! ライタ:40 ライタ:9 ライター:23 ライター:5 ライター:41 ライター:29 ライター:72 ライター:73 ライター:95 ライター:46
はい、 't2'が始まるとリストに何もないので、' while'は終了する前に終了します。 – RealSkeptic
また、 'ArrayList'はスレッドセーフではないので、壊れた例で、外部同期はありません。 – Kayaman
@RealSkeptic:t2を機能させる方法はありますか? –