ファイルからレベルをロードできるゲームを作成しています。これは別のスレッドで実行されますが、他のすべてはイベントディスパッチスレッドで実行されます。
非常に大きなテストファイルからロードしてコードをテストしましたが、レベルのロード中にイベントディスパッチスレッドが応答しない場合があります。
原因がわからないようです。これが私のコードの一部です:
public class LevelSelectionWrapper extends GamePanel {
...
private JList list;
private File[] files;
...
//Lock object for synchronization
private Object lock = new Object();
//Runnable for loading levels from files on a separate thread
private Runnable loader = new Runnable() {
@Override
public void run() {
synchronized(lock) {
//Load levels from files
List<Level> levels = LevelLoader.load(files); // <-------------
...
SwingUtilities.invokeLater(new ListUpdater());
}
}
};
...
private void createOpenFileButton(Container container) {
final JFileChooser fc = ...
...
//Create open button
JButton openButton = new JButton("Open file");
openButton.setFocusable(false);
openButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int returnVal = fc.showOpenDialog(LevelSelectionWrapper.this);
if(returnVal == JFileChooser.APPROVE_OPTION) {
synchronized(lock) { files = fc.getSelectedFiles(); }
//Load files on separate thread
new Thread(loader).start(); // <-------------
}
}
});
container.add(openButton);
}
}
コードに2つの矢印を追加しました。
- 1つ目は、時間のかかる方法です(ファイルが非常に大きい場合)。このコードの実行中に、イベントディスパッチスレッドが応答しない場合があります。
- 最後の1つは、ランナブルが呼び出される場所です。