如何从Main类中查看我的Thread变量?

时间:2013-05-24 10:40:06

标签: java multithreading

我有那段代码:

主要课程:

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);
    }  

 }
}

My Thread class

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;
}
}

My Thread类正在监视网络流量,所以我只能打电话一次

t1.getTexts()

随时随地,因为我的hashSet可以为空(此网络中存在延迟和延迟)。我怎样才能看到这个文本hashSet以及何时将一些String添加到hashSet中 - 我想让我的MAIN CLASS知道它吗?我只想以聪明的方式从Main类中观察我的Thread资源:)

如果在我的线程超时后它仍然是空的,我也想了解它。

1 个答案:

答案 0 :(得分: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编译器,所以要注意各种错误。)