1

ボタンの実行では、2つのメソッドを呼び出しています。

plotButton.addSelectionListener(new SelectionAdapter() {
    public void widgetSelected(SelectionEvent e) {
        startPrinterListOperation();  
        showAplotPlotterDialog();
    }
});

タスクを完了するにはstartPrinterListOperation();時間がかかります。showAplotPlotterDialog();しかし、最初のメソッドが完了するまでメソッドを実行したくありません 。だから私はこれを達成するためにスレッド管理を使用しようとしています。これが私が試したことです。

plotButton.addSelectionListener(new SelectionAdapter() {
    public void widgetSelected(SelectionEvent e) {
        Thread t = new Thread() {
            public void run() {
                startPrinterListOperation();  
            }
        };
        t.start();
        try {
            t.join();
        }
        catch (InterruptedException e1) {
            e1.printStackTrace();
        }

        showAplotPlotterDialog();

    }
});  

ただし、2番目の方法は、最初の方法が終了する前に開始されます。

4

3 に答える 3

2

私のコメントを拡張する:成功startPrinterListOperationしたことから明らかなように、非同期操作を開始して即座に終了するようjoinです。

起動された非同期操作が制御できない場合は、コールバックやポーリングなどを介して終了するのを観察できる可能性があります。次に、次のようなものを使用できますstartPrinterListOperation

void startPrinterListOperation() {
    final CountDownLatch c1 = new CountDownLatch(1);
    launchTheAsyncOp(new SomeCallback() {
        void x() {
            c1.countDown();
        }
    });
    try {
        c1.await(999, TimeUnit.SECONDS)
    }
    catch (InterruptedException e) {
        throw new MyRuntimeException("user didn't finish the op in 999 seconds, fail");
    }
}
于 2012-09-07T16:40:59.417 に答える
1

私はスレッドを気にしません、これはあなたのプログラムを過度に複雑にするだけです。

メソッドを編集できますstartPrinterListOperation()か?

代わりにshowAplotPlotterDialog();、メソッドの最後に追加し、startPrinterメソッドが最後に行うことを追加します。

于 2012-09-07T16:50:51.033 に答える
0

タイトルの一般的な質問に答えると、2 つのメソッドを直接呼び出すマスター スレッドがあり、2 番目のメソッドは最初のメソッドが完了するまで待機します。

あなたの特定のケースでは、最初のメソッドがしばらく実行され、ユーザーが待つ必要がないことを望んでいることを理解しています。

generatePrinterList()GUI を作成している間は、別のスレッドでメソッドを呼び出す必要があります。これを行うのは、GUI ユーザーが印刷またはプロットする可能性が非常に高く、ユーザーが GUI を使用している間にプリンター リストが変更される可能性が低いためです。

ユーザーが印刷またはプロットする前に、generatePrinterList()スレッドが終了する可能性があります。ただし、スレッドには、スレッドが完了したことを報告する方法が必要です。publicメソッドboolean isCompletedで読み取れるa を使用します。isCompleted()

必要に応じてisCompleted()メソッドにスレッド スリープ ループを含めることができるため、常に true を返します。この場合、メソッドは何も返す必要はありません。

于 2012-09-07T17:10:09.233 に答える