- - PR -
スレッド制御について
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2006-04-13 13:25
スレッドについて
■実現したいこと メイン側でArrayListに文字列をループで詰めています。 スレッド側では、そのArrayListの中身の文字列をループで出力させ続けます。 その後、メイン側でArrayListの中身の要素を一つずつ削除しまます。 スレッド側では、ArrayListを出力をさせ続けますが、メイン側でArrayList要素 を1ずつ削除したら、出力する文字列も1つずつ減らしたいと思います。 ■現在の問題点 メイン側ArrayListに文字列を詰めているときは、例外が発生しないのですが、 メイン側でArrayListの中身を一つずつ削除して、 スレッド側で、出力する文字列を一つずつ減らそうと思いますが、 ArrayListの要素を一つずつ削除するときに、java.lang.IndexOutOfBoundsException が発生してしまします。 おそらく、メイン側で要素を削除したのにもかかわらず、 スレッド側でArrayListの削除した部分のindexにアクセスしたからだと 思いますが、どのようにソースを修正すればいいのかがわかりません。 わかる方がいれば、アドバイスをいただきたいと思います。 宜しくお願いします。 package sample; import java.util.concurrent.CopyOnWriteArrayList; public class Execute { public static void main(String[] args) throws InterruptedException { Sab sab = new Sab(); Thread saThread = new Thread(sab); saThread.start(); CopyOnWriteArrayList<String> wordList = new CopyOnWriteArrayList(); ab.setWrodList(wordList); //wordListに詰めてる間は、sabの方では詰められた文字列だけ常に出力させ続けたい。 for(int i=0;i<10;i++){ wordList.add("hoge"+i ); } //10秒ごとに出力させているwordListの中身を一つずつ減らしていきたい。 for(int i=0;i<10;i++){ wordList.remove(10-i); } } } package sample; import java.util.concurrent.CopyOnWriteArrayList; public class Sab implements Runnable { CopyOnWriteArrayList wordList = new CopyOnWriteArrayList(); public void run() { //ループさせ続けて、メイン側でwordListにwordを挿入したり削除したりする。 //wordListに入っている情報を出力させつづけたい while(true){ int size = wordList.size(); if(0 < size){ for(int i=0;i<size;i++){ String word = (String)wordList.get(i); System.out.println(word); } System.out.println("-------------------"); }else{ System.out.println("現在wordlistの中身は空です。"); } try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } } } public void setWrodList(CopyOnWriteArrayList wordList){ this.wordList = wordList; } } |
|
投稿日時: 2006-04-13 13:36
なぜかといえば、Sabクラス側でsizeを取得してからリストの要素を取得するまでに、
メイン側で要素が削除されたからでしょう。CopyOnWriteArrayListのリファレンスを 見ればわかりますが、リストのスナップショットを利用できるのはIteratorを使用した ときだけです。ですので、Iteratorを利用した参照処理に変更すればよいでしょう。 |
|
投稿日時: 2006-04-13 13:41
ぬしさんありがとうございます。
昨日も、コメントしてくださいましたね。 さっそく試してみます。 |
1