0

UIを管理し、ItemObjectのメソッドを呼び出してDBにアイテムをインポートするJFrameサブクラスがあります。

public TestGUI() throws IOException
{

    initComponents();

    Item.importItems(progressBar); // static method that execute a new thread to import item witouth freeze my UI (I update a progressBar in it)

    table.refresh(); //Metodh that I need to execute only after "importItems()" methods is completed

}

Itemオブジェクトは、Runnableを実装して、新しいスレッドでインポート操作を実行します

public Item implements Runnable
{

    private JProgressBar progressBar;

    public void importItems (JProgressBar progressBar) throws IOException //Metodo per importare articoli da un file esterno. Usa i Thread.
    {

        this.progressBar = progressBar;

        Thread importThread = new Thread (new RefreshTable(),"Importer Thread");

        importThread.start();

    }

    void run ()
    {

        // I execute here all the DB operation that i need. I also update the progress bar             here

    }


}

table.refresh()実行が終了した後にのみ実行するようにそのコードを変更するにはどうすればよいItem.importImtes(progressBar)ですか?ありがとう!

4

6 に答える 6

3

スレッドで.join()メソッドを使用します。

于 2012-08-22T08:31:27.393 に答える
2

を使用する場合は、SwingWorkerSwingUtilitiesを確認してくださいSwing
ヘルパースレッドAPIが含まれています

于 2012-08-22T08:38:39.423 に答える
2

あるスレッドが別のスレッドを待機するようにしたい場合は、いつでもCountDownLatchを使用することもできます。1つを使用すると、一部のスレッドが完全に終了するまで待つ必要がないことも意味します。あなたの質問を私たちにとってより理解しやすいものにしてくれるなら、私たちはより多くの詳細を手伝うことができます。

たとえば、スレッド間でCountDownLatchを共有する必要があります。

public TestGUI() throws IOException{
      initComponents();
      private final CountDownLatch latch = new CountDownLatch(1);
      Item.importItems(progressBar, latch); // static method that execute a new thread to import item witouth freeze my UI (I update a progressBar in it)
      latch.await();
      table.refresh(); //Metodh that I need to execute only after "importItems()" methods is completed
}

そして反対側:

public Item implements Runnable {
    private JProgressBar progressBar;
    public void importItems (JProgressBar progressBar, CountDownLatch latch) throws IOException { //Metodo per importare articoli da un file esterno. Usa i Thread.

        this.progressBar = progressBar;

        Thread importThread = new Thread (new RefreshTable(),"Importer Thread");

        importThread.start();

    }

    void run () {

        // I execute here all the DB operation that i need. I also update the progress bar here
        //After everything finishes:
        latch.countDown(); // you want this to be executed in a finally block of the try catch
    }


}
于 2012-08-22T09:21:49.940 に答える
0

<Thread> .join()メソッドは、<Thread>が完了するまで現在のスレッドをブロックします。

于 2012-08-22T08:31:56.987 に答える
0

これはあなたがそれを使うべき方法です:

class ProgressBar extends Thread{
    public void run(){
        System.out.println("Progress Bar - start");
        try {
            Thread.currentThread().sleep(2000);
        } catch (InterruptedException e) {}
        System.out.println("Progress Bar - end");
    }
}
public class ThreadDemo {
    public static void main(String[] args) throws InterruptedException {
        System.out.println("Main Thread Start");
        Thread t1 = new Thread(new ProgressBar());
        t1.start();
        t1.join();
        System.out.println("Main Thread End");
    }
}

出力:

Main Thread Start
Progress Bar - start
Progress Bar - end
Main Thread End
于 2012-08-22T08:38:21.117 に答える
0

できることはtable.refresh();、子スレッドコードの最後にあるコードを移動し、それを使用SwingUtilities.InvokeLaterしてGUIスレッドイベントキューに転送することです。

 public void run() {
      //...
      SwingUtilities.InvokeLater(
            new Runnable() {
                 public void run() {
                     table.refresh();
                 }
            });         
 }

そうすれば、GUIスレッドで実行できますが、子スレッドがその作業を終了したときだけです。

于 2012-08-22T11:14:33.493 に答える