一連のファイルをバックグラウンドスレッドにロードするように設計された単純なマルチスレッドアルゴリズムがあり、ロードが完了するとすぐにJPanelに最初の画像が表示されます。JPanelのコンストラクターで、ローダーを起動し、次のように画像のリストを待ちます。
//MyPanel.java
public ArrayList<BufferedImage> images = new ArrayList<BufferedImage>();
int frame;
public MyPanel(String dir){
Thread loader = new thread (new Loader(dir, this));
loader.start();
frame = 0;
//miscellaneous stuff
synchronized(images){
while (images.isEmpty()){
images.wait();
}
}
this.setPrefferedSize(new Dimension(800,800));
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g)
g.drawImage(images.get(frame), 0, 0, 800, 800, null);
}
私のローダースレッドは次のようになります。
//Loader.java
String dir;
MyPanel caller;
public Loader(String dir, MyPanel caller){
this.dir = dir;
this.caller = caller;
}
@Override
public void run(){
File dirFile = new File(dir);
File[] files = dirFile.listFiles();
Arrays.sort(files);
for (File f : files) {
try {
synchronized (caller.images) {
BufferedImage buffImage = ImageIO.read(f);
caller.images.add(buffImage);
caller.images.notifyAll();
}
} catch (IOException e) {
}
}
}
notifyAll()
呼び出し元のスレッドがウェイクアップしてフレームに画像を表示する前に、実行が数回(通常は> 20)通過することを確認しました。また、imagesオブジェクトが実際に待機しているオブジェクトと同じオブジェクトであることを確認しました。を追加しようとしましたyield()
が、役に立ちませんでした。notifyAll()
待機中のスレッドをすぐに起こさないようにするための呼び出しはなぜですか?