Вам необходимо использовать Semaphore
.
Это позволяет вам иметь ряд «разрешений» для выполнения работы. Если вы хотите, чтобы одна задача выполнялась одновременно, то есть Semaphore
с одним разрешением, в противном случае есть Semaphore
с числом разрешений, превышающим число Thread
s в пуле.
static class Worker implements Runnable {
final Semaphore semaphore;
public Worker(Semaphore semaphore) {
this.semaphore = semaphore;
}
@Override
public void run() {
try {
semaphore.acquire();
try {
//do stuff
} finally {
semaphore.release();
}
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
}
public static void main(String[] args) {
final int numThreads = 10;
final ExecutorService executorService = Executors.newFixedThreadPool(10);
final Semaphore semaphore;
boolean myflag = true;
if (myflag) {
semaphore = new Semaphore(1);
} else {
semaphore = new Semaphore(numThreads);
}
final Worker worker = new Worker(semaphore);
executorService.submit(worker);
}
Этот пример немного надуманный, как вы можете просто использовать newSingleThreadExecutor()
, когда вам нужно только одно задание для запуска в то время, - но я полагаю, вы знаете, что и по какой-то причине не может.
EDIT
После пошарил немного, чтобы увидеть, если это может быть прибрано я наткнулся на this. Это намекает на аккуратным решение:
static interface TaskBlocker {
void acquire();
void release();
}
static class Worker implements Runnable {
final TaskBlocker taskBlocker;
public Worker(TaskBlocker taskBlocker) {
this.taskBlocker = taskBlocker;
}
@Override
public void run() {
taskBlocker.acquire();
try {
//do stuff
} finally {
taskBlocker.release();
}
}
}
public static void main(String[] args) {
final int numThreads = 10;
final ExecutorService executorService = Executors.newFixedThreadPool(numThreads);
final TaskBlocker taskBlocker;
boolean myflag = true;
if (myflag) {
taskBlocker = new TaskBlocker() {
final Lock lock = new ReentrantLock();
@Override
public void acquire() {
lock.lock();
}
@Override
public void release() {
lock.unlock();
}
};
} else {
taskBlocker = new TaskBlocker() {
@Override
public void acquire() {
}
@Override
public void release() {
}
};
}
final Worker worker = new Worker(taskBlocker);
executorService.submit(worker);
}
Можете ли вы дать нам некоторый контекст относительно того, что/почему вы делаете? –
попробовал thread.isAlive()? – Ankit
Что значит? Вы имеете в виду, работает ли _task_? В «ExecutorService» всегда будет «Threads». Пожалуйста, разместите свой код, чтобы мы могли помочь вам, а не догадываться о том, что вам может понадобиться. –