У меня есть исполнитель с конечными границами, и он использует CallerRunsPolicy
. Поэтому, когда я отправляю слишком много заданий, я сталкиваюсь с RejectedExecutionException
, и моя работа выполняется в вызывающем потоке.Определите, когда выполняется CallerRunsPolicy.
Предполагается, что задание просто печатает, выполняется ли оно в службе исполнителя или в вызывающем потоке. Каков наилучший способ достижения этого? Есть ли встроенная видимость, когда задание выполняется в потоке вызывающего?
Одним из возможных решений, о которых я думаю, является расширение Runnable и CallerRunsPolicy, а затем переопределение rejectedExecution(Runnable r, ThreadPoolExecutor executor)
для хранения флага в Runnable.
class CustomRunnable implements Runnable
{
@Override
public void run()
{
if(willExecuteOnCallingThread) // Running on new thread.
else // Running on calling thread.
}
boolean willExecuteOnCallingThread = false;
}
class LoggedCallerRunsPolicy extends CallerRunsPolicy
{
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor)
{
((CustomRunnable)r).setWillExecuteOnCallingThread(true);
super.rejectedExecution(r, executor);
}
}