0

だから私は少し問題があります。私はループ内で多くの数字をチェックしています。ここで、数字は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);
            }
        }
    }
}
4

1 に答える 1

0

問題を理解している場合、1 つの解決策は、各スレッドに独自のBlockingQueue<Integer>orを与えることConcurrentLinkedQueue<Integer>です。次に、メイン スレッドのループはAtomicIntegerofferその値を各キューにインクリメントし、スレッドはtakeまたはpollキューで整数を取得して処理します。このようにして、スレッドがスリープ状態になっても、整数を見逃すことはありません。スレッドは、ウェイクアップ時にキューで待機します。

public class MainThread extends java.lang.Thread {
    final private List<BlockingQueue<Integer>> queues;
    final private AtomicInteger atomicInteger = new AtomicInteger();

    public MainThread(List<BlockingQueue<Integer>> queues) {
        this.queues = queues;
    }

    public void run() {
        while (true) {
            int temp = atomicInteger.getAndIncrement();
            for(BlockingQueue<Integer> queue : queues) {
                queue.offer(temp);
            }
        }
    }
}

public class WorkerThread extends java.lang.Thread {
    private final BlockingQueue<Integer> queue;

    public WorkerThread(BlockingQueue<Integer> queue) {
        this.queue = queue;
    }

    public void run() {
        while(true) {
            int temp = queue.take();
            // process temp
        }
    }
}
于 2013-06-03T01:26:01.533 に答える