だから私は少し問題があります。私はループ内で多くの数字をチェックしています。ここで、数字はAtomicInteger
毎回インクリメントされるだけです。問題は、「エラー」 (プログラムではなくサーバーに関係するエラー) が発生し、スレッドがスリープする必要があることです。スレッドがスリープした後、すべてのスレッドが戻って、エラーのために見逃した数値を再確認したいのですが、AtomicInteger
が既にインクリメントされているため、最後の数値のみを再確認します。これが私のコードです:
public class Red extends java.lang.Thread {
private final LinkedBlockingQueue<Integer> queue;
public Red(LinkedBlockingQueue<Integer> queue) {
this.queue = queue;
}
public void run()
{
while(true){
try{
int i = queue.take();
Main.code.setValueAttribute(""+i);
HtmlPage reply = (HtmlPage)Main.btnFinal.click();
Main.webClient.waitForBackgroundJavaScript(Main.r.nextInt(500));
if ( reply.asText().indexOf( "Error" ) > -1 || reply.asText().indexOf( "unavailable" ) > -1) {
int sleep = Main.r.nextInt(900000);
System.out.println(" error, on "+i+" sleeping for "+ sleep);
Thread.sleep(sleep);
continue;
}
System.out.println("Code "+i+" checked.");
}catch(Exception e){
e.printStackTrace();
continue;
}
}
}
}
スレッドにスターを付けるための私のコードは次のとおりです。
List<LinkedBlockingQueue<Integer>> queuelist = new ArrayList<LinkedBlockingQueue<Integer>>();
for (int n = 0; n < threads; n++) {
queuelist.add(new LinkedBlockingQueue<Integer>());
java.lang.Thread t = new Red(queuelist.get(n));
t.start();
}
java.lang.Thread a = new MainThread(queuelist);
a.start();
MainThread のコードは次のとおりです。
public class MainThread extends java.lang.Thread {
final private List<LinkedBlockingQueue<Integer>> queues;
final private AtomicInteger atomicInteger = new AtomicInteger(10000000);
public MainThread(List<LinkedBlockingQueue<Integer>> queues) {
this.queues = queues;
}
public void run() {
while (true) {
int temp = atomicInteger.getAndIncrement();
for(LinkedBlockingQueue<Integer> queue : queues) {
queue.offer(temp);
}
}
}
}