Java同時プログラミング:ThreadPoolExecutor+Callable+Future(FutureTask)スレッドの実行状況を検出...

5192 ワード

問題のように(要点をまとめる)
  • ThreadPoolExecutorを使用してスレッドを作成し、Callable+Futureを使用してスレッドの実行状況を実行し、検出する.
  • V get(long timeout,TimeUnit unit)throws InterruptedException,ExecutionException,TimeoutExceptionは上記のget機能と同様に、設定タイムアウト時間が多くなります.パラメータtimeoutはタイムアウト時間を指定し、uintは時間の単位を指定し、列挙クラスTimeUnitに関連する定義があります.計算がタイムアウトした場合、TimeoutExceptionが放出されます.
  • はFutureTask:FutureTask task=(FutureTask)poolExecutor.submit(new MyRunner(500);
  • 結局:class FutureTask implements RunnableFuture,interface RunnableFuture extends Runnable,Future;
  • FutureTaskはスレッドプールにスレッドとして投げ込まれて実行することができ、次のFutureのようにスレッドの実行状況を検出することもできる.
  • のスレッドプールpoolExecutor.submitはinterface RunnableFuture extends Runnable,Future(ソースコードを参照してください):
  • を返します.
        public  Future submit(Runnable task, T result) {
            if (task == null) throw new NullPointerException();
            RunnableFuture ftask = newTaskFor(task, result);
            execute(ftask);
            return ftask;
        }

    参考学習記事リスト
  • リンク1:https://www.cnblogs.com/dolphin0520/p/3949310.html
  • リンク2:『java同時プログラミングの芸術』
  • https://blog.csdn.net/yangliuhbhd/article/details/70276153

  • 1.テーマ
    Future                 ,           ,              。             Java         。
    
    Future         ,        Future,  V   Future           。 Future         :
    
    boolean cancel (boolean mayInterruptIfRunning)        。              ,        
    boolean isCancelled ()         ,           ,    true
    boolean isDone ()         。              、     ,    true
    V get () throws InterruptedException, ExecutionException          ,    V     。InterruptedException        , ExecutionException      ,       ,    CancellationException
    V get (long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException     get    ,        。  timeout      ,uint       ,    TimeUnit       。      ,   TimeoutException
             Future     java.util.concurrent.FutureTask  javax.swing.SwingWorker。    FutureTask        。FutureTask       Runnable  ,         Executor  。

    2.コード
    /**
     *      ,  100      
     */
    
    class MyRunner implements Callable{
        private int  sleepTime ;
    
        public MyRunner(int sleepTime) {
            this.sleepTime = sleepTime;
        }
    
        Logger logger = Logger.getLogger("myRunner");
        @Override
        public Integer call() throws Exception {
            logger.info("       ");
            Thread.sleep(sleepTime);
            int sum = 0;
            for(int i=1;i<=100;i++){
                sum += i;
            }
            logger.info(sleepTime/1000.0+"s ,       .100       :"+sum);
            return sum;
        }
    }

    3.テストメインスレッド起動
    import java.util.concurrent.*;
    import java.util.logging.Logger;
    
    /** https://www.cnblogs.com/dolphin0520/p/3949310.html
     * 《java       》
     */
    public class Test {
        private static Logger logger = Logger.getLogger("Test");
        public static void main(String[] args) {
            /**
             *   Callable   
             *         ,call()              V  
             * Callable    ThreadPoolExecutor      
             *   futureTask
             */
            BlockingQueue queue = new SynchronousQueue<>();
            ThreadFactory nameThreadFactory = new ThreadFactory() {
                @Override
                public Thread newThread(Runnable r) {
                    return new Thread(r);
                }
            };
            ThreadPoolExecutor poolExecutor =
                    new ThreadPoolExecutor(2, 2, 0, TimeUnit.MILLISECONDS, queue, nameThreadFactory);
    
            /**
             *     Callable   runnable             
             * */
            Future task = poolExecutor.submit(new MyRunner(500));
    
            poolExecutor.shutdown();
    
            try {
                task.get(100,TimeUnit.MILLISECONDS);
                logger.info("  submit    ?  done?");
                boolean done = task.isDone();
                logger.info(String.valueOf(done));
                //       ,         
                if(!done){
                    task.cancel(true);
                }
            } catch (InterruptedException e) {
                task.cancel(true);
            } catch (ExecutionException e) {
                task.cancel(true);
            } catch (TimeoutException e) {
                logger.info("  ");
                task.cancel(true);
            }
    
            logger.info("        ");
        }
    }

    テスト結果
       16, 2019 10:05:18    com.thread.MyRunner call
      :        
       16, 2019 10:05:18    com.thread.Test main
      :   
       16, 2019 10:05:18    com.thread.Test main
      :         

    テスト結果2プローブ時間task.get(1000,TimeUnit.MILLISECONDS)を修正する.
       16, 2019 10:25:20    com.thread.MyRunner call
      :        
       16, 2019 10:25:20    com.thread.MyRunner call
      : 0.5s ,       .100       :5050
       16, 2019 10:25:20    com.thread.Test main
      :   submit    ?  done?
       16, 2019 10:25:20    com.thread.Test main
      : true
       16, 2019 10:25:20    com.thread.Test main
      :         
    

    転載先:https://www.cnblogs.com/zhazhaacmer/p/11362316.html