2016-09-21 5 views
0

私は2つのクラスを持っています。 POJOとメイン。私はこのコードを実行するとExecutorService.awaitTermination(timeout、unit)はタイムアウト後も引き続き実行します

POJOクラス

public class Processor implements Runnable{ 

private int id; 

public Processor(int id) 
{ 
    this.id = id; 

} 
@Override 
public void run() { 
    System.out.println("Started ...."+ id); 
    try { 
     Thread.sleep(1000); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    System.out.println("Stoped ..." + id); 
} 

} 

メインクラス

public class Main { 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    ExecutorService executor = Executors.newFixedThreadPool(2); 
    for(int i = 0; i < 5;i++) 
    { 
     executor.submit(new Processor(i)); 


    } 
    executor.shutdown(); 
    System.out.println("All tasks Submits"); 
    try { 
     executor.awaitTermination(1, TimeUnit.MILLISECONDS); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     System.out.println("Intrupted or Timeout"); 

    } 
    System.out.println("all Tasks completed"); 
} 

}

私は

Started ....0 
All tasks Submits 
Started ....1 
all Tasks completed 
Stoped ...1 
Started ....2 
Stoped ...0 
Started ....3 
Stoped ...2 
Started ....4 
Stoped ...3 
Stoped ...4 

しかし、私の理解あたりとしての出力を取得しますかつて中断された例外を発生させて戻す必要があります。しかし、それがTRYブロックから出た後でさえもなぜ動くか。

答えて

1

は、いずれか早い方、すべてのタスクがシャットダウン要求後に実行が完了した、またはタイムアウトが発生した場合、または現在のスレッドが中断されるまでawaitTermination

ブロックのjavadocに向けることができます。

つまり、このメソッドを呼び出すことは、すでに送信されたジョブがもう実行されないことを意味しません。だから、欠陥はあなたの前提の中にあります。

あなたのメインはタイムアウトになりますが、単に「すべてのタスクが完了しました」と表示されても、それが真の文にならないからです。提出されたタスクは、完了した時点で完了します。そして前に!

実際にすべてを停止させたい場合は、代わりにshutdownNowを試してください。

1

@GhostCatはあなたがこのブローのようにそれを行うことができますブロックしながら、例外が発生する場合awaitTerminationは、与えられた時間のためにブロックされたスレッドを取得し、言ったように:

Thread t = new Thread(){ 
    public void run() { 
    ExecutorService exec = Executors.newCachedThreadPool(); 
    exec.execute(new Runnable() { 
     @Override 
     public void run() { 
     System.out.println("start ..."); 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
     } 
     System.out.println("end ..."); 
     } 
    }); 

    exec.shutdown(); 

    try { 
     exec.awaitTermination(100, TimeUnit.MILLISECONDS); 
    } catch (Exception e) { 
     System.out.println("awaitTermination"); 
    } 
    System.out.println("main ended"); 
    }; 
}; 
t.start(); 
Thread.sleep(10);; 
t.interrupt(); 

実行このコードをmainメソッドに。

関連する問題