0

我有那个代码:

主类:

public class myTest {

public static void main(String[] args) {

   try {
        Thread t1 = new myThreadClass("thread 1");
        t1.start();
    } catch (UnknownHostException ex) {
        Logger.getLogger(glownyTest.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(glownyTest.class.getName()).log(Level.SEVERE, null, ex);
    }  

 }
}

我的线程类

public class myThreadClass extends Thread {

private HashSet<String> texts = new HashSet<String>();

public myThreadClass(String id) throws UnknownHostException, IOException {}

@Override
public void run() {
     ... collecting Strings into my hashSet ....
}

public HashSet<String> getTexts() {
    return texts;
}
}

我的 Thread 类正在监视网络流量,所以我不能调用一次

t1.getTexts()

任何时候我想,因为我的 hashSet 可以是空的(这个网络中存在延迟和延迟)。我怎样才能看到这个文本 hashSet 以及何时将一些字符串添加到 hashSet 中 - 我希望我的 MAIN CLASS 知道它?我只想以智能的方式从 Main 类中观看我的 Thread 资源:)

如果我的线程超时后它仍然是空的,我也想知道它。

4

1 回答 1

0

您可以为此使用条件变量。尝试类似:

class Monitor {

    private final ConcurrentMap<String,String> data = new ConcurrentHashMap<String,String>();
    private final Object mutex = new Object();

    /* Private to the monitoring thread. Wakes up other
     * threads, which may be waiting for data to arrive 
     */

    public void addElement(String key) {
        data.put(key, key);
        synchronized (mutex) { mutex.notifyAll(); }
    }

    public void removeElement(String key) {
        data.remove(key);
        synchronized (mutex) { mutex.notifyAll(); }
    }

    public Set<String> getElements() {
        return data.keySet();
    }

    /* Can be called from any thread. Will wait at most "timeout"
     * milliseconds
     */

    public boolean waitForChanges(long timeout) throws InterruptedException {

        final long then = System.currentTimeMillis() + timeout;
        long left = timeout;

        synchronized (mutex) {

            while (data.isEmpty() && left > 0) {

                mutex.wait(left);
                left = then - System.currentTimeMillis();
            }

            return !data.isEmpty();
        }
    }
}

class MonitoringTask extends Runnable {

    private final Monitor monitor;

    MonitoringTask(Monitor m) {
        this.monitor = m;
    }  

    public void run() {

        while (true) {

            if (somethingHasHappened()) {

                monitor.addElement("foo");
            }
        }
    }
}

class Main {

    public static void main(String[] args) {

        final Monitor monitor = new Monitor();
        final MonitoringTask task = new MonitoringTask(monitor);
        final Thread thread = new Thread(task);

        thread.setName("Monitor Thread");
        thread.start();

        if (monitor.waitForChanges(1500)) {

            final Set<String> elts = monitor.getElements();
            ...

        } else {

            // Time-out
        }
    }
}

(我没有尝试将它呈现给 Java 编译器,因此请注意各种错误)。

于 2013-05-24T10:50:20.483 回答