파일에서 레벨을로드 할 수있는 게임을 만들고 있습니다. 이 작업은 별도의 스레드에서 수행되는 반면 다른 모든 작업은 Event Dispatch Thread에서 수행됩니다.내 코드가 스레드로부터 안전하지 않은 이유는 무엇입니까?
정말 큰 테스트 파일에서로드하여 코드를 테스트 한 결과 레벨이로드되는 동안 이벤트 발송 스레드가 응답하지 않는 것으로 나타났습니다.
원인을 파악할 수없는 것 같습니다. 내가 코드에 두 개의 화살표를 추가 한
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);
}
}
: 여기에 내 코드의 일부이다
- 첫 번째는 시간이 소요 방법 (파일이 정말 큰 경우)입니다. 때로는이 코드가 실행되는 동안 Event Dispatch Thread가 응답하지 않습니다.
- 마지막 하나는 실행 파일이 호출되는 곳입니다.
이 문맥에서'syncronized (lock) '이란 무엇입니까? 나에게 syncronization의 나쁜/불필요한 사용처럼 보인다. 예를 들어 로컬로 파일 목록을 가져 와서 복사본을 만들고 로더에 복사를 전달하는 것보다 나중에 잠글 수있는 공유 개체를 사용하는 것이 좋습니다. 내가 오해하고 있다면 그게 목적이 될거야, 아마도 너는 그것에 대해 정교 할 수있을거야. – dimo414
이 앱의 EDT 만 응답하지 않나요, 아니면 시스템의 나머지 부분입니까? –
@Ralf : EDT와 작업자 스레드라는 두 개의 스레드 만 사용하고 있습니다. EDT는 작업자 스레드가 완료 될 때까지 응답하지 않습니다. –