飽和ソースコード解析戦略

序文

Githubの:https://github.com/yihonglei/thinking-in-concurrent

戦略中止

新しいタスクの提出は、例外は呼び出し側によって捕獲されたときにデフォルトポリシー、直接投げRejectedExecutionExceptionはチェック。

new ThreadPoolExecutor.AbortPolicy()
/**
 * A handler for rejected tasks that throws a
 * {@code RejectedExecutionException}.
 */
public static class AbortPolicy implements RejectedExecutionHandler {
    /**
     * Creates an {@code AbortPolicy}.
     */
    public AbortPolicy() { }

    /**
     * Always throws RejectedExecutionException.
     *
     * @param r the runnable task requested to be executed
     * @param e the executor attempting to execute this task
     * @throws RejectedExecutionException always
     */
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        throw new RejectedExecutionException("Task " + r.toString() +
                                             " rejected from " +
                                             e.toString());
    }
}

二CallerRuns戦略

メカニズムを調整するには、いないタスクを放棄するためにスローされていませんが、いくつかのタスクは、呼び出し側にフォールバックします。これは、スレッドプール内のスレッドで新しいタスクを実行していません、

しかし、実装を担当して新しいタスクの呼び出しexectorスレッド、ある曲を、実行します。

new ThreadPoolExecutor.CallerRunsPolicy()
/**
 * A handler for rejected tasks that runs the rejected task
 * directly in the calling thread of the {@code execute} method,
 * unless the executor has been shut down, in which case the task
 * is discarded.
 */
public static class CallerRunsPolicy implements RejectedExecutionHandler {
    /**
     * Creates a {@code CallerRunsPolicy}.
     */
    public CallerRunsPolicy() { }

    /**
     * Executes task r in the caller's thread, unless the executor
     * has been shut down, in which case the task is discarded.
     *
     * @param r the runnable task requested to be executed
     * @param e the executor attempting to execute this task
     */
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        if (!e.isShutdown()) {
            r.run();
        }
    }
}

3つの戦略を破棄

新しいタスクの提出は断念されました。

new ThreadPoolExecutor.DiscardPolicy()
/**
 * A handler for rejected tasks that silently discards the
 * rejected task.
 */
public static class DiscardPolicy implements RejectedExecutionHandler {
    /**
     * Creates a {@code DiscardPolicy}.
     */
    public DiscardPolicy() { }

    /**
     * Does nothing, which has the effect of discarding task r.
     *
     * @param r the runnable task requested to be executed
     * @param e the executor attempting to execute this task
     */
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
    }
}

四DiscardOldest戦略

キューは、「チームのヘッド、」タスク、および新しいタスクを提出しようとしています。タスクのヘッドは、(作業キューのプライオリティキューのシーンに適していない)に廃棄されています

new ThreadPoolExecutor.DiscardOldestPolicy()
/**
 * A handler for rejected tasks that discards the oldest unhandled
 * request and then retries {@code execute}, unless the executor
 * is shut down, in which case the task is discarded.
 */
public static class DiscardOldestPolicy implements RejectedExecutionHandler {
    /**
     * Creates a {@code DiscardOldestPolicy} for the given executor.
     */
    public DiscardOldestPolicy() { }

    /**
     * Obtains and ignores the next task that the executor
     * would otherwise execute, if one is immediately available,
     * and then retries execution of task r, unless the executor
     * is shut down, in which case task r is instead discarded.
     *
     * @param r the runnable task requested to be executed
     * @param e the executor attempting to execute this task
     */
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        if (!e.isShutdown()) {
            e.getQueue().poll();
            e.execute(r);
        }
    }
}

ファイブカスタム飽和処理戦略

import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
/**
 * 循环处理,当队列有空位时,该任务进入队列,等待线程池处理
 */
public class CustomRejectedExecutionHandler implements RejectedExecutionHandler {
  public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
    try {
      executor.getQueue().put(r);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
}

 

公開された502元の記事 ウォンの賞賛358 ビュー118万+

おすすめ

転載: blog.csdn.net/yhl_jxy/article/details/103218700