1
JButtonを押した後、しばらくして私のプログラムのUIがフリーズします。私は、これがSwingスレッドを詰まらせるセマフォであることを発見しました。これは、セマフォのacquire()
コール含む方法である:ActionPerformedからメソッドを呼び出してメインスレッドでメソッドを実行します
private void fetch(int numThreads) {
//some code here
sem = new Semaphore(numThreads);
for (int i = 0; i < model.getRowCount(); i++){
try {
sem.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
//some code here
}
そして、ここでは、私が理解したようfetch()
concFetchButt.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
switchButtonStates(false);
}
});
fetch(Integer.parseInt(threadsNumField.getText()));
}
への呼び出しを行う唯一の方法であるが、このコードは、上のfetch()
を実行して終了しますスイングスレッドは、スイングとは何の関係もないと思われます。
私の質問は次のとおりです。Swingスレッドの代わりにプログラムのメインスレッドでSwingのActionPerformed()から呼び出されたメソッドを実行するにはどうすればよいですか?
'main(string []) 'メソッドで使用されるスレッドは、アクションリスナーがアクティブになるまでに終了している可能性があります。別のスレッドを使います。これは、GUIとやりとりするのに便利なもので、 'SwingWorker'で提供されています。 –
タイムリーに受け入れていただきありがとうございます。 – GhostCat