Sanju 私はあなたが次のラウンドロビン方式でそれらを実行したいと思っていると思います:
スレッド 1: 1,6 など スレッド 2: 2,7 スレッド 3: 3,8 スレッド 4: 4,9 スレッド 5: 5,10
まず第一に、スレッドをそのようなシーケンスで実行したい場合、これはスレッドの意図したものではありません。次に、スレッドプールでそれが可能だとは思いません。それでも必要な場合は、必要に応じて変更できるラウンドロビン方式でスレッドを実行するための私のソリューションを次に示します。
private static class EmailProcessor implements Runnable {
private final Object currentLock;
private final Object nextLock;
private UserEmail userEmail;
public EmailProcessor (UserEmail userEmail,, Object currentLock, Object nextLock) {
this.userEmail = userEmail;
this.currentLock = currentLock;
this.nextLock = nextLock;
}
@Override
public void run() {
try {
work = //reading email
while ( work != null) {
try {
currentLock.wait();
// Do your work here.
}
catch(InterruptedException e) {}
synchronized(nextLock) {
nextLock.notify();
}
}//while ends
} catch (IOException e) {
e.printStackTrace();
}
synchronized(nextLock) {
nextLock.notify(); /// Ensures all threads exit at the end
}
}
public EmailRoundRobin(int numberOfAccountsToRead) {
locks = new Object[numberOfAccountsToRead];
//Initialize lock instances in array.
for(i = 0; i < numberOfAccountsToRead; ++i) locks[i] = new Object();
//Create threads
int j;
for(j=0; j<(numberOfAccountsToRead-1); j++ ){
Thread linePrinterThread = new Thread(new EmailProcessor(emailInfo + "Temp" + j,locks[j],locks[j+1]));
linePrinterThread.start();
}
Thread lastLinePrinterThread = new Thread(new EmailProcessor(emailInfo + "Temp" + j,locks[numberOfFilesToRead-1],locks[0]));
lastLinePrinterThread.start();
}
public void startProcessing() {
synchronized (locks[0]) {
locks[0].notify();
}
}
public static void main(String[] args) {
EmailRoundRobin emailRoundRobin = new EmailRoundRobin(4);
emailRoundRobin.startPrinting();
}
}
[この質問] ( Java でラウンド ロビン方式でスレッドを実行する) に対する回答からこれを取り上げました。同様の要件がありました。その回答にも記載されている Phaser を使用するオプションがあります。