1

我在我的 WebApplication 中有下面这段代码,每当用户登录到应用程序时,它基本上就是这样做的。

  1. addSymbols 方法将在用户登录操作期间被调用。
  2. 由于上述原因,PriorityBlockingQueue 被启动
  3. PriorityBlockingQueue 将该符号添加到 HashSet 中,然后对其进行迭代以在该新添加的符号上运行特定任务。

我在这里面临的问题是,作为 HashSet 一部分的 while 循环一遍又一遍地执行相同的任务,因为它处于线程的 while true 条件内。

我正在粘贴示例输出以了解与其相关的上下文。

Symbol From priorityBlocking  SymbolTest
Symbol From allSymbolsSet   SymbolTest
Symbol From allSymbolsSet   SymbolTest
Symbol From allSymbolsSet   SymbolTest
Symbol From allSymbolsSet   SymbolTest
Symbol From allSymbolsSet   SymbolTest
Symbol From allSymbolsSet   SymbolTest
Symbol From allSymbolsSet   SymbolTest
Symbol From allSymbolsSet   SymbolTest
Symbol From allSymbolsSet   SymbolTest
Symbol From allSymbolsSet   SymbolTest

这是我执行上述操作的代码。

package com;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.PriorityBlockingQueue;

public class TaskerThread extends Thread {
    private PriorityBlockingQueue<String> priorityBlocking = new PriorityBlockingQueue<String>();
    private Set<String> allSymbolsSet = new HashSet<String>();
     ExecutorService es = Executors.newFixedThreadPool(2);

    public void addSymbols(String str) {
        if (str != null) {
            priorityBlocking.add(str);
        }
    }

    public void run() {
        while (true) {
            try {
                while (priorityBlocking.peek() != null) {
                    String symbol = priorityBlocking.poll();
                    allSymbolsSet.add(symbol);
                    try {
                        System.out.println("Symbol From priorityBlocking" +"  "+ symbol);
                    }   catch (Exception e) {
                            e.printStackTrace();
                    }
                }
                Iterator<String> ite = allSymbolsSet.iterator();
                while (ite.hasNext()) {
                    String symbol = ite.next();
                    if (symbol != null && symbol.trim().length() > 0) {
                        try {
                            System.out.println("Symbol From allSymbolsSet"+"   "+symbol);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
                Thread.sleep(2000);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String args[]) {
        try {
            TaskerThread qT = new TaskerThread();
            qT.start();
            qT.addSymbols("SymbolTest");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

请让我知道是否有任何方法可以使迭代器任务只运行一次。

4

1 回答 1

0

我懂了。这是正在发生的事情:

您的循环开始,并且一个符号被添加到队列中。它在线程循环中被拉出队列,然后迭代器循环运行。然后外部循环 ( while (true)) 再次循环,这一次,没有要添加的符号,但迭代器循环仍然执行。如果添加了新符号,您只需要执行迭代器循环:

            boolean added = false;
            while (priorityBlocking.peek() != null) {
                added = true;
                String symbol = priorityBlocking.poll();
                allSymbolsSet.add(symbol);
                try {
                    System.out.println("Symbol From priorityBlocking" +"  "+ symbol);
                }   catch (Exception e) {
                        e.printStackTrace();
                }
            }
            if (added) {
                Iterator<String> ite = allSymbolsSet.iterator();
                while (ite.hasNext()) {
                    String symbol = ite.next();
                    if (symbol != null && symbol.trim().length() > 0) {
                        try {
                            System.out.println("Symbol From allSymbolsSet"+"   "+symbol);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }

或者,在您没有要添加的内容时,使用takeor也会停止您的循环。poll(long,TimeUnit)这也应该防止循环的第二部分不必要地运行。您只需要处理InterruptedException.

于 2013-07-17T09:47:36.863 回答