web-dev-qa-db-ja.com

Javaでメインスレッドとは別のスレッドを実行するにはどうすればよいですか?

目標はメインクラス内から個別のスレッドの実行を呼び出せるようにすることです。

いくつかのコンテキスト:processを実行する必要があるプログラムがあります。プロセス(a cmd one)は、メインプログラムの実行が完了し、メモリからアンロードされたときにのみ実行されます。

メインクラスにはどのコードを含める必要がありますか?

16
helpmepls

つまり、JVM(Javaプログラム)が終了しても終了しないJavaスレッドを開始するにはどうすればよいですか

The answer is: you can't do that.

Javaでは、JVMが存在する場合、すべてのスレッドが実行されるためです。これは例です:

class MyRunnable implements Runnable { 
   public void run() { 
       while ( true ) { 
           doThisVeryImportantThing(); 
       } 
   } 
} 

上記のプログラムは、たとえば次のコードによってメインスレッドから開始できます。

MyRunnable myRunnable = new MyRunnable(); 
Thread myThread = new Thread(myRunnable);
myThread.start(); 

このサンプルプログラムは、doThisVeryImportantThing内の何かがそのスレッドを終了しない限り、決して停止しません。次の例のように、デーモンとして実行できます。

MyRunnable myRunnable = new MyRunnable(); 
Thread myThread = new Thread(myRunnable);
myThread.setDaemon(true); // important, otherwise JVM does not exit at end of main()
myThread.start(); 

これにより、main()スレッドが終了すると、myThreadも終了します。

ただし、Javaから別のJVMを起動することもできます。そのため、この質問を確認することをお勧めします。JavaアプリケーションはRuntime.execを使用しますか?

33
Kdeveloper

外部プログラムを実行する別のスレッドを作成します。

class MyRunner implements Runnable{
  public void run(){
     Runtime.exec("your cmd")
  }
}

次に、main()でスレッドを開始します。

MyRunner myRunner = new MyRunner(); 
Thread myThread = new Thread(myRunner);
myThread.start();

このようにして、メインプログラムは実行を継続し、バックグラウンドスレッドはこのプログラムが終了すると外部プロセスを開始して終了します。

5
Peter Knego

Java Threadを実装し、run()でそれを開始する通常の手段を使用して)で「切り離された」スレッドを作成できるかどうか、私は完全にはわかりません。

Runtime.exec()を使用してスレッドをフォークし、Javaをスレッドとしてではなく、完全に別のプロセスとして実行する必要がある場合があります。

0
Tony Ennis

JVMの終了後も存続するプロセスを生成するには、Runtime.exec()を使用する必要があります。メインプロセスの終了後に実行したいので、実際には2つの方法で実行できます。

1)クリーンシャットダウン中にのみ実行するように処理する場合は、次のようにできます。

public static void main(String[] args) {
    doThisProgramsStuff();
    spawnSecondProcess();
}

2)または、クリーンでないシャットダウンでもプロセスを実行する場合(またはGUIアプリケーションの場合)、シャットダウンフックを追加できます。

public static void main(String[] args) {
    Runtime.getRuntime().addShutdownHook(new Thread() {
        public void run() {
            spawnSecondProcess();
        }
    });
    doThisProgramsStuff();
}

しかし、これにはすべて問題があります。 JVMが終了すると、子プロセスには何も接続されていない標準の入出力があるため、出力バッファーがいっぱいになり、ブロックされる可能性があります。プロセスがこれらのストリームに出力を生成しないことを確認するか、Windowsで/ dev/nullにリダイレクトするのと同等の方法で、これが起こらないようにするために何かを行う必要があります。

0
Cameron Skinner

最初のプログラムを呼び出すスクリプトが必要なようですが、最初のプログラムが終了すると、2番目のプログラムが呼び出されます。

何かのようなもの

program1
program2

編集:2つのタスクを並行して実行するには、次のことができます

program1 &
program2

bash /ユニットシェルで。

またはdosシェルで

start program1
program2
0
Peter Lawrey