/* * bitlet - Simple bittorrent library * Copyright (C) 2008 Alessandro Bahgat Shehata, Daniele Castagna * * 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.bitlet.wetorrent.util.thread; import java.util.LinkedList; import java.util.Queue; public class InterruptableTasksThread extends Thread { Queue<ThreadTask> tasks = new LinkedList<ThreadTask>(); ThreadTask currentTask = null; private boolean closing = false; /** * Creates a new instance of InterruptableTasksThread */ public InterruptableTasksThread() { } public InterruptableTasksThread(String name) { super(name); } public synchronized void addTask(ThreadTask task) { tasks.add(task); if (tasks.size() == 1) { notify(); } } public void run() { ThreadTask currentTask = nextTask(); while (!isClosing() && currentTask != null) { try { if (!currentTask.execute()) { currentTask = nextTask(); } } catch (Exception e) { closing = true; currentTask.exceptionCought(e); } } } public synchronized ThreadTask nextTask() { currentTask = null; while (!isClosing() && (currentTask = tasks.poll()) == null) { try { wait(); } catch (InterruptedException ex) { closing = true; } } return currentTask; } public synchronized ThreadTask getCurrentTask() { return currentTask; } public synchronized void interrupt() { if (currentTask != null) { currentTask.interrupt(); } closing = true; notify(); } public synchronized boolean isClosing() { return closing; } }