- PR -

スレッドの同期について

1
投稿者投稿内容
未記入
会議室デビュー日: 2004/03/14
投稿数: 4
投稿日時: 2004-08-09 11:18
はじめまして。iceといいます。

さっそくですが質問をさせていただきたいと思います。
下記のような感じのプログラムを書いたのですが、スレッドの同期が上手くいかないようなのです。何が問題なのでしょうか?
fileOpの処理内容を変えてみたところ上手くいったりもしたので、ImageIOのメソッドが何か問題なのではないかとも思うのですが、よくわかりませんでした。


class ThreadTest
{
private static synchronized void fileOp(File f){//このメソッドの同期が上手くいきません
..//javax.imageio.ImageIOを利用したイメージファイルの読み書きを含む処理
}
class MyThread extends Thread{
private File d;
MyThread(File d){
this.d = d;
}
public void run(){
..//ディレクトリd以下のファイルfについてfileOp(f)の呼び出しを含む処理
}
}

ThreadTest(){
new MyThread(new File("path0")).start();
new MyThread(new File("path1")).start();
}
public static void main(String[] args){
ThreadTest test = new ThreadTest();
}
}


[ メッセージ編集済み 編集者: ice 編集日時 2004-08-09 11:20 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-08-09 11:47
synchronized 宣言されているメソッドは必ずシングルスレッドで実行されますが、インスタンスが異なれば同じメソッドでも同時に実行されます。
MyThread のインスタンスを2つ作っているようですのでそれぞれのスレッドでは fileOp メソッドが同時に実行される可能性があります。
どのインスタンス(またはスレッド)にもかかわらず必ず排他的に実行する必要があるのなら同期用のオブジェクトを作ってそれぞれのスレッドに渡しておく必要があります。
未記入
会議室デビュー日: 2004/03/14
投稿数: 4
投稿日時: 2004-08-09 12:02
回答ありがとうございます。
見づらくて申し訳ないのですが、fileOpメソッドはMyThreadクラスではなくThreadTestクラスのメソッドなんです。
その場合でも、同期用のオブジェクトが必要になるんでしょうか。
未記入
会議室デビュー日: 2004/03/14
投稿数: 4
投稿日時: 2004-08-09 13:33
テストしてみたところ、どうやらスレッドの同期はとれているようです。
しかし同じファイルについて実行すると、ファイルが読めないというIOExceptionが発生してしまいます。ImageIOのread()やwrite()がファイルを開放してくれていないのではないかとも思うのですが、何か情報や経験をお持ちの方はいらっしゃいませんでしょうか。
あいつー
ベテラン
会議室デビュー日: 2004/05/20
投稿数: 89
投稿日時: 2004-08-09 13:38
同期が取れていると判断された理由は何ですか?

同一ファイルに対してread()やwrite()が出来ない、というのは複数のスレッドが
同時に同一ファイルを読み込み、書込みを取得しようとして失敗している、
とも考えられるのですが。
でゅうく
大ベテラン
会議室デビュー日: 2003/11/30
投稿数: 129
投稿日時: 2004-08-09 13:52
その IOException のスタックトレースを提示した方が、回答が得られ易いと思いますよ。


[ メッセージ編集済み 編集者: でゅうく 編集日時 2004-08-09 14:04 ]
未記入
会議室デビュー日: 2004/03/14
投稿数: 4
投稿日時: 2004-08-09 14:19
原因がわかりました。run()メソッドの処理内でファイルリストを取得するようにしていたのですが、前のスレッドの処理によって拡張子が書き換えられてしまい、後のスレッドがファイルを見つけられなかったという単純なミスでした;
何をやってるんだ。。

スレッドの同期はfileOpメソッドにしばらく待ってからダイアログを表示するコードを追加して、同じファイルを複数のスレッドから処理させてみたところダイアログの表示間隔が一定だったので、同時には処理されていないのではないかと思いました。
スレッドの同期をチェックする一般的な方法はどんなものなのでしょうか。
それから、IIOExceptionでした。

どうもありがとうございました。

[ メッセージ編集済み 編集者: ice 編集日時 2004-08-09 14:26 ]

[ メッセージ編集済み 編集者: ice 編集日時 2004-08-09 14:34 ]
1

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