/*
* Copyright 2012 NGDATA nv
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.lilyproject.util.concurrent;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* This file was copied from Mule: Copyright (c) MuleSource, Inc. All rights reserved. http://www.mulesource.com
*
* A handler for unexecutable tasks that waits until the task can be submitted for
* execution or times out. Generously snipped from the jsr166 repository at: <a
* HREF="http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/src/main/java/util/concurrent/ThreadPoolExecutor.java"></a>.
*/
public class WaitPolicy implements RejectedExecutionHandler {
private final long _time;
private final TimeUnit _timeUnit;
/**
* Constructs a <tt>WaitPolicy</tt> which waits (almost) forever.
*/
public WaitPolicy() {
// effectively waits forever
this(Long.MAX_VALUE, TimeUnit.SECONDS);
}
/**
* Constructs a <tt>WaitPolicy</tt> with timeout. A negative <code>time</code>
* value is interpreted as <code>Long.MAX_VALUE</code>.
*/
public WaitPolicy(long time, TimeUnit timeUnit) {
super();
_time = (time < 0 ? Long.MAX_VALUE : time);
_timeUnit = timeUnit;
}
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
try {
if (e.isShutdown() || !e.getQueue().offer(r, _time, _timeUnit)) {
throw new RejectedExecutionException();
}
}
catch (InterruptedException ie) {
Thread.currentThread().interrupt();
throw new RejectedExecutionException(ie);
}
}
}