是否可以知道HashSet中新添加的符号?

时间:2013-07-22 15:42:37

标签: java

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

当添加一个符号时,下面的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();
        }
    }
}

3 个答案:

答案 0 :(得分:6)

如果正在添加的Object被忽略,则

add()方法返回false,因为它已经存在

答案 1 :(得分:0)

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

答案 2 :(得分: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。