2016-05-11 4 views
0

私はExecutorServiceを使用していますが、しばらくメインプログラムをブロックしていますが、メインプログラムをブロックしたくありません。スレッドの実行が完了するまでとしない限り、現在それがStart 4を印刷しません実行プログラム - メインプログラムをブロックしない

Start 1 
Start 3 
Start 2 
Start 5 
Start 4 
finally 

public class Test { 

    public static void main(String[] args) throws InterruptedException, ExecutionException, TimeoutException { 
     ExecutorService executor = null; 

     try { 
      executor = Executors.newFixedThreadPool(1); 

      System.out.println("Start 1"); 
      Runnable task = new Runnable() { 
       public void run() { 
        System.out.println("Start 2"); 
        try { 
         Thread.sleep(7000); 
         System.out.println("Start 5"); 

        } catch (Exception e) { 

        } 
       } 
      }; 
      System.out.println("Start 3"); 

      // executor.execute(task); 
      Future future = executor.submit(task); 
      Object result = future.get(9, TimeUnit.SECONDS); 
      System.out.println("Start 4"); 

     } catch (Exception e) { 

     } finally { 
      System.out.println("finally"); 
      executor.shutdownNow(); 
     } 

    } 
} 

出力:ここ

はコードです。私が探しているのは、タイムアウトがあり、スレッドがバックグラウンドで実行され、メインスレッドをブロックしないメカニズムです。

+0

結果が必要ですか?結果が必要な場合、メインスレッドはどのように続行しますか? – matt

答えて

0

使用していますfuture.get(9, TimeUnit.SECONDS);これは、送信されたスレッドが終了するまで9秒間待機します。
メインプログラムが待機する必要はなく、スレッドによって何も返される必要もない場合は、executor.execute呼び出しを使用してください。ここ
はあなたがStart 4を印刷する前に、現在のコードでタイムアウト例外をキャッチされていませんが、あなたは `スタート4' 行の後に例外をキャッチされ、更新されたコード...

ExecutorService executor = null; 
    try { 
     executor = Executors.newFixedThreadPool(1); 
     System.out.println("Start 1"); 
     Runnable task = new Runnable() { 

      public void run() { 

       System.out.println("Start 2"); 
       try { 
        Thread.sleep(7000); 
        System.out.println("Start 5"); 
       } 
       catch (Exception e) { 
       } 
      } 
     }; 
     System.out.println("Start 3"); 
     executor.execute(task); 
     System.out.println("Start 4"); 
    } 
    catch (Exception e) { 
    } 
    finally { 
     System.out.println("finally"); 
     executor.shutdown(); 
    } 
} 
+0

コメントありがとうございます。私はこのプログラムが何をしているのか知っています。 現在、スレッドが実行を完了するまで、「開始4」は表示されません。 私が探しているのは、タイムアウトがあり、プロセスがバックグラウンドで実行され、メインをブロックしないメカニズムです。どのように私は元のプログラムを変更することができます – sargam

+0

私の答えを –

+0

更新 'executor.shutdownNow()'の代わりに 'executor.shutdown()'の使用に注意してください。 'shutdownNow'はスレッドを中断します。 –

0

です。タイムアウトが発生した場合には希望の出力が得られません。

あなたは常に Futureタスクのタイムアウトに関わらず、 Start 4を取得し、上記のコードで

try { 
     Object result = future.get(9, TimeUnit.SECONDS); 
    } catch (CancellationException ce) { 
     System.out.println("CancellationException "); 
    } catch (ExecutionException ee) { 
     System.out.println("ExecutionException "); 
    } catch (InterruptedException ie) { 
     System.out.println("InterruptedException "); 
     Thread.currentThread().interrupt(); // ignore/reset 
    } 

Object result = future.get(9, TimeUnit.SECONDS); 

からあなたのコード

を変更

詳細については、ThreadPoolExecutorafterExecuteメソッドを参照してください。

メインスレッドのブロックに関しては、現在ブロックget()Futureにコールされています。メインスレッドをブロックしたくない場合は、ExecutorServiceをExecutorCompletionServiceに変更し、上記のページのとおりに新しいAPIを使用してください。

関連する問題