2017-05-05 28 views
0

からの停止方法・実行を強制的にどのように私は方法があります。 呼び出し可能<Object>呼び出し方法

は、私が試した:

public class Test { 

    public static void main(String[] args) throws MyException { 
     runWithTimeout(new Datasource()); 
    } 

    public static void runWithTimeout(final Datasource ds) throws MyException { 

     ExecutorService executor = Executors.newSingleThreadExecutor(); 
     Callable<Object> task = new Callable<Object>() { 
      public Object call() throws MyException { 
       ds.create(); 
       return null; 
      } 
     }; 
     Future<Object> future = executor.submit(task); 
     try { 
      future.get(5, TimeUnit.SECONDS); 

     } catch (TimeoutException tex) { 
      throw new MyException("TimeoutException. Caused By", tex); 

     } catch (InterruptedException iex) { 
      throw new MyException("InterruptedException. Caused By", iex); 

     } catch (ExecutionException eex) { 
      throw new MyException("InterruptedException. Caused By", eex); 

     } finally { 
      future.cancel(true); 
      executor.shutdown(); 
     } 
    } 
} 

しかし、作成方法がまだ実行されています。どうすれば強制停止できますか?

create()メソッドを変更することはできません。だからcreate()メソッドの現在のスレッドにisInterrupted()を追加できません。

+0

簡単に言えば、何もできません。割り込みに応答しないコードは不正なコードです。あなたはそれを強制的に停止することはできません。 – VGR

答えて

0

Future.cancelコールは進行中のプロセスを終了しません。これは、これがキャンセルされる将来のタスクのヒントのようなものです。それ以外に、サードパーティのライブラリからThreadを停止する保証された方法はありません。あなたが望むことができる唯一のことは、ThreadGroupを反復して、interrupt()を呼び出し、次に希望を実行して、進行中のThreadisInterruptedの処理を持ち、それ自体をキャンセルすることです。

関連する問題