/* * This file is part of muCommander, http://www.mucommander.com * Copyright (C) 2002-2016 Maxence Bernard * * muCommander is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * muCommander 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 for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.mucommander.ui.main.tree; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * A thread that executes i/o operations. * @author Mariusz Jakubowski * */ public class IOThread extends Thread { private static final Logger LOGGER = LoggerFactory.getLogger(IOThread.class); /** a queue with tasks to execute */ private List<Runnable> queue; /** a time after this thread is marked as blocked */ private long blockThreshold; /** a time when this thread signalled that is alive */ private volatile long lastActionTime = 0; /** * Creates a new instance of an IOThread. * @param queue a queue with tasks * @param blockThreshold a time after this thread is marked as blocked [ms] */ public IOThread(List<Runnable> queue, long blockThreshold) { super("IOThread"); this.queue = queue; this.blockThreshold = blockThreshold; } @Override public void run() { while (!interrupted()) { lastActionTime = System.currentTimeMillis(); while (queue.size() > 0) { Runnable task = queue.remove(0); try { task.run(); } catch (Exception e) { LOGGER.debug("Caught exception", e); } lastActionTime = System.currentTimeMillis(); } try { synchronized (this) { wait(blockThreshold / 2); } } catch (InterruptedException e) { break; } } } /** * Checks if current thread is blocked. This is done by checking if * last action time is smaller than block threshold. * @return true if thread is running */ public boolean isBlocked() { return (lastActionTime != 0) && (System.currentTimeMillis() - lastActionTime > blockThreshold); } }