Semaphore
を使用する必要があります。
これにより、多くの「許可」が働くことができます。一度に1つのタスクしか実行しない場合は、Semaphore
に1つの許可を設定します。そうでない場合は、プール内のThread
より大きな数の許可を持つSemaphore
があります。あなたが一度に実行するように一つのタスクを必要とするときあなただけnewSingleThreadExecutor()
を使用することができるよう
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);
}
この例は少し不自然です - 私はあなたがそれを知っているし、いくつかの理由でできないと仮定します。これは私がthis出くわし整理することが可能かどうかを確認するために少し周りをつついた
EDIT
。スレッドは、スレッドExecutorServiceのプールで実行されている場合、私がチェックするにはどうすればよい
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'が生きています。あなたが必要とするものを推測するのではなく、私たちがあなたを助けることができるように、あなたのコードを投稿してください。 –