スイングの進捗バーを表示および増分し、進捗情報を表示し、データベース操作を実行するスレッドがあります。スレッドは、次のようにボタンのイベントから開始されます。Javaスレッドから抜け出す方法
`public class SetupPanel extends javax.swing.JFrame
{
private static Thread myThread = null;
private void initComponents()
{
setupPanel = new javax.swing.JPanel();
setupBtn = new JButton("Save Setup");
//.. all the other swing components needed..
setupBtn.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
myThread = new Thread(new Runnable()
{
@Override
public void run()
{
try
{
//update db, progress bar, display messages, sleep
myThread.yield();
}
catch (InterruptedException e)
{
Logger.getLogger(SwingProgressBar.class.getName())
.log(Level.SEVERE, null, e);
System.exit(0);
}
}
});
myThread.start();
}
});`
私はデータベースとプログレスバー上のすべての操作が終了した後に実行を停止するスレッドを好きですが、(Thread.stopのようです)もう使用できず、thread.yield()は動作しません。スレッドから抜け出す方法はわかりません。
私はこのようなエラーをキャッチしてスレッドを破ることができるという希望でスレッドの歩留まり後にゼロで割るなどのエラーを強制しましたが、これはどちらもうまくいかなかった。
注意をそれを更新するSwingWorkerのを使用する方法についていくつかのコードをSwingWorker.を使用することができます直接(あなたは多くの競合状態に遭遇する可能性があります)。 UIスレッドでのみUI操作を行うことができます。 'EventQueue.invokeLater'を使用して、データベース更新スレッドからUIスレッドでいくつかの作業をスケジュールできます。 –
スレッド**は、コードがなくなると終了するメソッドと同じように、プログラムフローが完了すると停止します。あなたの質問は、これが起こることを妨げているものを示していません。 –
注: 'myThread.yield()'は 'myThread'に何もしません。それはそれを呼び出したスレッドで動作します。 'yield()'はインスタンスメソッドではありません: 'Thread'クラスの' static'メソッドです。 –