/*
*
* Paros and its related class files.
*
* Paros is an HTTP/HTTPS proxy for assessing web application security.
* Copyright (C) 2003-2004 Chinotec Technologies Company
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the Clarified Artistic License
* as published by the Free Software Foundation.
*
* This program 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
* Clarified Artistic License for more details.
*
* You should have received a copy of the Clarified Artistic License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
// ZAP: 2014/04/01 Changed to allow to set a name to created threads.
// ZAP: 2016/09/22 JavaDoc tweaks
package org.parosproxy.paros.common;
public class ThreadPool {
private Thread[] pool = null;
private final String threadsBaseName;
public ThreadPool(int maxThreadCount) {
this(maxThreadCount, null);
}
public ThreadPool(int maxThreadCount, String threadsBaseName) {
pool = new Thread[maxThreadCount];
this.threadsBaseName = threadsBaseName;
}
/**
* Gets a free thread from the thread pool. If there is no free thread, returns {@code null}.
*
* @param runnable the {@code Runnable} to be run in the thread
* @return the {@code Thread}, already started, with the given {@code Runnable}, or {@code null} if none available.
*/
public synchronized Thread getFreeThreadAndRun(Runnable runnable) {
for (int i=0; i<pool.length; i++) {
if (pool[i] == null || !pool[i].isAlive()) {
pool[i] = new Thread(runnable);
if (threadsBaseName != null) {
pool[i].setName(threadsBaseName + i);
}
pool[i].setDaemon(true);
pool[i].start();
return pool[i];
}
}
return null;
}
/**
* Waits until all threads finish its tasks (at most some time for each).
* <p>
* If not completed yet, do not wait. Each thread should kill itself.
* @param waitInMillis the number of milliseconds to wait for the threads
*/
public void waitAllThreadComplete(int waitInMillis) {
for (int i=0; i<pool.length; i++) {
if (pool[i] != null && pool[i].isAlive()) {
try {
pool[i].join(waitInMillis);
} catch (InterruptedException e) {
}
}
}
}
public boolean isAllThreadComplete() {
for (int i=0; i<pool.length; i++) {
if (pool[i] != null && pool[i].isAlive()) {
return false;
}
}
return true;
}
}