2016-05-16 8 views
0

私はメインスレッドからスレッドを実行したい、しかし、メインスレッドが終了した後にこのスレッドを実行したい。 どうすればいいですか? スレッドにメインスレッドへの参照を渡し、join()メソッドを呼び出すことはできますか?メインスレッドの終了後にどのスレッドが確実に実行されるようにするには?

+4

を呼び出すことにより、メインスレッドの仕上げを持っていますか? –

+0

私はそれを同時に実行したい、しかし、メインが完了する前に確実に... – Sharon182

+0

あなたは、前に終了するメインスレッド... _what_正確にしたいですか?そして、Scott Hunterが言ったことと同じように:あなたは何かをするメインスレッドを持っています。私はそれが何であるのか分からないが、それは何でもM() 'と呼んでみよう。 'M()'が終わった後に何か起こりたいことがあります。それを 'S()'と呼ぶことにしましょう。あなたのメインスレッドが 'M()'をしてから 'S()'を実行するのはなぜですか?あなたは何を達成しようとしていますか? –

答えて

1

最も近いshutdownHook

Runtime.getRuntime().addShutdownHook(new Thread(){ 
    ... 
}); 

だろう。しかし、これは実行しますが、プロセスは、プロセスは、死ぬことのthatsたら、あなたは「doesnのプロセスに任意のスレッドを追加することはできません、まだ生きているだろうもう存在しない。

1

これにはRuntime.getRuntime()メソッドを使用できます。私はシャットダウン・フックの代わりに他の回答を使用することをお勧めしますが、あなたは次のように、人為的、基本的なスレッドオブジェクトでこれを行うことができますdocumentation

0

でこれについての詳細を見つけることができ

public static void main(String[] args) { 
    ..... 
    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable(){ 
     public void run(){ 
      // run when the main thread finishes. 
     } 
    })); 
} 

:ここでは一例であり、 。

public static void main(String[] args) throws Exception { 
    // parametrizes with current thread 
    new Deferrable(Thread.currentThread()); 
    System.out.println("main thread"); 
} 

static class Deferrable extends Thread { 
    Thread t; 

    Deferrable(Thread t) { 
     this.t = t; 
     // optional 
     // setDaemon(true); 
     start(); 
    } 

    @Override 
    public void run() { 
     try { 
      // awaits termination of given Thread before commencing 
      t.join(); 
      System.out.println("other thread"); 
     } catch (InterruptedException ie) { 
      // TODO handle 
     } 
    }; 
} 

これは常に印刷されます:

main thread 
other thread 
+0

なぜ人為的に言うのですか?そしてなぜあなたは 'Runtime.getRuntime()。addShutdownHook(...)'が良い解決策だと思いますか?元の質問は[XY問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)です:OPは彼女が達成したいことを私たちに語っていません。彼女はすべて彼女の問題に対する解決策に焦点を当てていますが、実際の問題点はわかりません。 –

+0

@ jameslarge「addShutdownHook」に言及した答えは本質的に優れていると思いますが、私の答えはうまくいきますが、人工的にはスレッドに参加することで機能が有効になっているからです。これは、同じことを達成するための別の方法と考えられるかもしれません。 – Mena

+0

@jameslargeこれは、コメントを読んで、OPが何を望んでいるのかが少しはっきりしないと言った - 私は同意する。 – Mena

0

このような状況の典型的なシンクロナイザがCountDownLatchです。それが必要なものをやって前にCountDownLatchために生成されたスレッドの待機を持っている、とあなたは2つのスレッドが必要なのですか、なぜあなたは、それらを同時に実行したくない場合はCountDownLatch.countDown()

public static void main(String[] args) { 
    final CountDownLatch latch = new CountDownLatch(1); // will need only one countDown to reach 0 
    new Thread(() -> { 
     try { 
      latch.await(); // will wait until CountDownLatch reaches 0 

      // do whatever is needed 

     } catch (InterruptedException e) { 
      Thread.currentThread().interrupt(); 
     } 
    }).start(); 

    // do stuff 

    // end main thread 

    latch.countDown(); // will make the latch reach 0, and the spawned thread will stop waiting 
} 
関連する問題