2016-08-03 3 views
2

私は比較的新しいThreadPoolExecutorです。私は、実行可能ファイルを追跡することができるかどうかを確認する前に、を実行し、を実行した後にを実行します。Executeのrunnable.toStringの後にScheduledThreadPoolExecutorがあります

runnable.toString()afterExecute(Runnable t, Throwable t)を使用して取得することによって。さて、私はログをrunnable自体の中に入れることができることを理解しています...しかし、私はこの方法が何を生み出すのか不思議でした。

ThreadPoolExecutorの場合、runnable.toStringは、execute(runnable)の前と同じで、afterExecute()でも同じです。

ただし、 ScheduledThreadPoolExecutorが異なっています。そのExecuteのrunnable.toStringは全く異なるです。例えば

は、前:[email protected]、afterExecute:java.[email protected]zxc

さえPKG名は同じです。 これはなぜですか?

private MyThreadPool() { 
    threadPool = new ThreadPoolExecutor(NUMBER_OF_CORES, MAX_CORES, 
     KEEP_ALIVE_TIME, KEEP_ALIVE_TIME_UNIT, workQueue) { 
     @Override 
     public void afterExecute(Runnable r, Throwable t) { 
      super.afterExecute(r, t); 
      Log.d(TAG, "ThreadOps onDone: " + r.toString()); 
      // (A) will return same --> [email protected] 
     } 
    }; 
    threadPool.setRejectedExecutionHandler(rejectedHandler); 

    scheduledThreadPool = new ScheduledThreadPoolExecutor(NUMBER_OF_CORES) { 
     @Override 
     public void afterExecute(Runnable r, Throwable t) { 
      super.afterExecute(r, t); 
      Log.d(TAG, "ThreadOps onDelayDone: " + r.toString()); 
      // (D) does not return same? 
      // I am expecting --> [email protected] , but get... 
      // java.[email protected]zxc 
     } 
    }; 
    scheduledThreadPool.setRejectedExecutionHandler(rejectedHandler); 
} 

public void execute(Runnable runnable) { 
    Log.d(TAG, "ThreadOps exe: " + runnable.toString()); 
    // (A) lets say toString --> [email protected] 
    threadPool.execute(runnable); 
} 

public void delayExecute(Runnable runnable, long delayms) { 
    Log.d(TAG, "ThreadOps exe @" + delayms + ": " + runnable.toString()); 
    // (D) lets say toString --> [email protected] 
    scheduledThreadPool.schedule(runnable, delayms, TimeUnit.MILLISECONDS); 
} 

答えて

1

ScheduledThreadPoolExecutor内部で簡単に自分のスケジュール設定(すなわち。ヒープの先頭に次に実行する必要があります1)に基づいて提出されたタスクを追加して検索するために種類のヒープを維持します。このヒープへのアクセスを支援するために

ScheduledThreadPoolExecutorの実装は、とりわけ、ヒープ内の位置を記述するカスタム実装でRunnableまたはCallableインスタンスあなたscheduleを飾ります。それはあなたのログに表示されるScheduledFutureTaskです。これは実装の詳細です(これはprivateクラス)、これに頼るべきではありません。

+0

ありがとうございます。私は見るので、それは別のクラスで変換され、次にそこからexecute'd、toStringが完全に変更された理由が説明されます。 – TWL

関連する問題