/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 6362121
* @summary Test one ScheduledThreadPoolExecutor extension scenario
* @author Martin Buchholz
*/
// based on a test kindly provided by Holger Hoffstaette <holger@wizards.de>
public class ScheduledTickleService {
// We get intermittent ClassCastException if greater than 1
// because of calls to compareTo
// Record when tasks are done
// our tickle service
// We override decorateTask() to return a custom
// RunnableScheduledFuture which explicitly removes
// itself from the queue after cancellation.
protected <V> RunnableScheduledFuture<V>
RunnableScheduledFuture<V> task) {
final ScheduledThreadPoolExecutor exec = this;
return new CustomRunnableScheduledFuture<V>(task) {
// delegate to wrapped task, except for:
public boolean cancel(boolean b) {
// cancel wrapped task & remove myself from the queue
for (int i = 0; i < concurrency; i++)
new ScheduledTickle(i, tickleService)
pass();
}
// our Runnable
// my tickle service
// remember my own scheduled ticket
// remember the number of times I've been tickled
// my private name
super();
this.name = "Tickler-"+i;
}
// set my tickle interval; 0 to disable further tickling.
// cancel & remove previously created ticket
}
// requeue with new interval
}
}
public synchronized void run() {
try {
numTickled++;
// tickle 3 times and then slow down
if (numTickled == 3) {
}
// ..but only 5 times max.
else if (numTickled == 5) {
}
} catch (Throwable t) { unexpected(t); }
}
}
// This is just a generic wrapper to make up for the private ScheduledFutureTask
static class CustomRunnableScheduledFuture<V>
implements RunnableScheduledFuture<V> {
// the wrapped future
super();
}
// Forwarding methods
public V get()
throws InterruptedException, ExecutionException {
}
}
if (this == other)
return 0;
else if (other instanceof CustomRunnableScheduledFuture)
else
}
}
//--------------------- Infrastructure ---------------------------
else fail(x + " not equal to " + y);}
}