- PR -

スレッド制御について

1
投稿者投稿内容
カブトムシ子太郎
会議室デビュー日: 2006/04/12
投稿数: 16
お住まい・勤務地: 横浜
投稿日時: 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;
  }
}
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-04-13 13:36
なぜかといえば、Sabクラス側でsizeを取得してからリストの要素を取得するまでに、
メイン側で要素が削除されたからでしょう。CopyOnWriteArrayListのリファレンスを
見ればわかりますが、リストのスナップショットを利用できるのはIteratorを使用した
ときだけです。ですので、Iteratorを利用した参照処理に変更すればよいでしょう。
カブトムシ子太郎
会議室デビュー日: 2006/04/12
投稿数: 16
お住まい・勤務地: 横浜
投稿日時: 2006-04-13 13:41
ぬしさんありがとうございます。
昨日も、コメントしてくださいましたね。
さっそく試してみます。
1

スキルアップ/キャリアアップ(JOB@IT)