1

スイングアプリケーションがあります。メニューバーのmenuItemをクリックすると、API呼び出しを行おうとしていますが、これには時間がかかると思われます。

API呼び出しが結果を出すまで、Swingアプリがスタック/ハングしたくなかったので、SwingUtilities.invokeLaterを使用して、API呼び出しを処理する新しく生成されたスレッドを分離しました。上記のコードは次のとおりです

public void actionPerformed(ActionEvent e){
    Object src=e.getSource();

    if(src.equals(theJMenuItemClicked)){
        SwingUtilities.invokeLater(new Runnable() {

                    @Override
                    public void run() {
                        //apicall here
                    }
                })
    }

API呼び出しスレッドが機能している限り、「API呼び出しが進行中です」というメッセージと「スレッドの中止」ボタンを含むJDIalogを表示します。

Jdialogの「ABortThread」ボタンをクリックしてスレッドを強制終了したいのですが。

それが通常のスレッドである場合、があり、同じ上でThread t = new Thread(new Runnable())を呼び出します。t.stop

SwingUtilitiesによって生成された特定のスレッドインスタンスを取得して、停止を呼び出すにはどうすればよいですか?簡単に言うと、上記で作成したスレッドを強制終了するにはどうすればよいですか?

4

1 に答える 1

0
public class SwingUtilitiesExample implements ActionListener {

// Declaration of Swing Components
private JMenuItem menuItem;
private JButton abortOperation;

// Thread-safe indicator of the presence of the Thread
private volatile boolean isThreadRunning = false;

public SwingUtilitiesExample() {
    // Initialize Swing Components 
    menuItem = new JMenuItem();

    // Add ActionListeners
    menuItem.addActionListener(this);
    abortOperation.addActionListener(this);
}

@Override
public void actionPerformed(ActionEvent e) {
    Object source = e.getSource();
    if (source.equals(menuItem)) {
        isThreadRunning = true;
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                while (isThreadRunning) {
                    // API calls here
                }
            }
        });
    } else if (source.equals(abortOperation)) {
        isThreadRunning = false;
    }
}
}

の値isThreadRunningを false に変更すると、スレッドを効果的に中止できます。スレッドがこのブール値を定期的にチェックしている限り、このコードは問題なく機能します。

このメソッドThread.stop()は非推奨です。Oracle は、この方法は本質的に安全ではないと述べています。したがって、使用を控える必要があります。上記のコード サンプルに示すように、代わりにスレッド セーフなブール変数を使用して、スレッドのフローを制御してみてください。

スレッドを終了した後で何らかの型を返すことを検討している場合は、SwingWorkerクラスを検討することをお勧めします。

于 2011-10-23T10:26:12.763 に答える