1

我的应用程序中有这段代码,它连续运行。

每当添加一个符号时,下面的 Thread 就会启动并执行两个不同的任务(为了简单起见,当前任务表示为 sys out )

第一次一切运行良好,但从第二次开始,该任务将针对 allSymbolsSet 中存在的所有符号重复。

我在这里面临的问题是我只想为添加的新符号运行任务。(例如,如果 allSymbolsSet 最初由 3 个符号组成,并且当向其中添加新符号时,它会为所有 4 个符号运行该任务,而我希望它只为新添加的符号执行它)

这是我的代码

package com;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.PriorityBlockingQueue;

public class TaskerThread extends Thread {
    private PriorityBlockingQueue<String> priorityBlocking = new PriorityBlockingQueue<String>();
    private Set<String> allSymbolsSet = new HashSet<String>();

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

    public void run() {
        while (true) {
            try {
                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();
                    }
                }
                Iterator<String> ite = allSymbolsSet.iterator();
                if (added) {
                    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");
        Thread.sleep(110);
        qT.addSymbols("Symbo2222222");


        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
4

3 回答 3

6

add()如果正在添加的对象因为已经存在而被忽略,则方法返回 false

于 2013-07-22T15:46:27.243 回答
0

好吧,当然它适用于集合中的所有元素,您正在迭代它们!

package com;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.PriorityBlockingQueue;

public class TaskerThread extends Thread {
    private final PriorityBlockingQueue<String> priorityBlocking = new PriorityBlockingQueue<String>();
    private final Set<String> allSymbolsSet = new Collections.synchronizedSet(new HashSet<String>());

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

    public void run() {
        while (true) {
            try {
                while (true) {
                    final String symbol = priorityBlocking.take();
                    if (allSymbolsSet.add(symbol)) {
                        doSomething(symbol); // do whatever you want with the symbol
                    }
                }
            } 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();
        }
    }
}

这应该可以满足您的需求。更好地处理可能的异常,即 InterruptedException。

于 2013-07-23T08:28:22.170 回答
0

一个简单的解决方案是有两个哈希集 - set1 包含所有符号,set2 包含新添加的符号。将新符号添加到 set2,在线程运行中,执行完成后,将新符号添加到 set1 并将其从 set2 中删除。那个怎么样?

于 2013-07-22T16:11:33.803 回答