20

2つの操作を実行する必要がある関数があります。1つは高速で終了し、もう1つは実行に時間がかかります。長時間実行される操作をスレッドに委任できるようにしたいのですが、スレッドがいつ終了するかは気にしませんが、スレッドは完了する必要があります。以下に示すようにこれを実装しましたが、start()呼び出しの後に関数が終了するため、2番目の操作は実行されません。関数が返されるが、2番目の操作スレッドも実行を終了し、親スレッドに依存しないことを確認するにはどうすればよいですか?

public void someFunction(String data)
{
   smallOperation()
   SecondOperation a = new SecondOperation();
   Thread th = new Thread(a);
   th.Start();
}

class SecondOperation implements Runnable
{
  public void run(){
  // doSomething long running
 }
} 
4

7 に答える 7

46
public void someFunction(final String data) {
    shortOperation(data);
    new Thread(new Runnable() {
        public void run(){
            longOperation(data);
        }
    }).start();
}

someFunctionが呼び出されると、JVMはifを実行しlongOperationます

  1. それを実行しているスレッドはデーモンとしてマークされていません(上記のコードではそうではありません)
  2. longOperation()例外をスローせず、
  3. System.exit()への呼び出しは行われません。longOperation()
于 2010-04-20T16:58:13.620 に答える
1

スレッドが終了する前にJVMは終了しません。あなたが投稿したこのコードはコンパイルすらしません。おそらく問題は実際のコードにあります。

于 2010-04-20T16:11:10.347 に答える
1

2番目の関数が実行されていない場合、関数が返されることとは何の関係もありません。何かが呼び出されSystem.exit()た場合、または関数が例外をスローした場合、スレッドは停止します。それ以外の場合は、メインスレッドが停止しても、完了するまで実行されます。これは、新しいスレッドをデーモンに設定することで防ぐことができますが、ここではそれを行っていません。

于 2010-04-20T16:11:22.790 に答える
1

この質問に答えるのは遅いかもしれませんが、ここに実用的な解決策があります。runnablesをExecutorServiceに追加するだけです。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

ExecutorService executor = Executors.newFixedThreadPool(10);
        executor.execute(new Runnable() {
            @Override
            public void run() {
                //your code
            }
        });
于 2019-04-19T07:11:17.563 に答える
1

Java 1.8以降では、非同期コードを非常に簡単に実行できます。次のコードでお会いしましょう:

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Semaphore;

public class HelloWorld {
  public static void main(String[] args) {
    CompletableFuture<String> future = CompletableFuture.supplyAsync(()->
      //run the code async        
      "result"
    );
    String result = future.join(); //wait async result
    System.out.println(result);
  }
}
于 2021-02-03T14:55:44.557 に答える
0

私があなたの質問を正しく理解した場合、あなたは呼び出しsomeFunction()、shortsmallOperation()を実行し、スレッドを実行し、SecondOperationこの関数から戻ったときにSecondOperation完了していることを確認したいと思います。

私が提案したフローが正しい場合は、次の行を追加するだけで済みます。

public void someFunction(String data)
{
   smallOperation()
   SecondOperation a = new SecondOperation();
   Thread th = new Thread(a);
   th.Start();
   th.join(); //add this line to make your MainThread await for this to finish . 
}

class SecondOperation implements Runnable
{
  public void run(){
  // doSomething long running
 }
} 

この記事を見ると、「スレッドでjoin()メソッドを呼び出すと、呼び出し元のスレッドは待機状態になります。参照されているスレッドが終了するまで待機状態のままになります」と記載されています。私はあなたが達成しようとしていることを考えています

そうではなく、SecondOperation終了時に通知を受け取りたい場合は、asyncTaskを使用することをお勧めします

于 2019-09-04T12:18:34.617 に答える
-1

最新のJavaを使用したソリューション

public void someFunction(String data) {
    smallOperation();
    new Thread(() -> {
        // doSomething long running
    }).start();
}
于 2018-12-21T15:33:23.693 に答える