我有一个程序在监听随机数。它连接到一个发布者,每次更新时给我一个数字和一个新的计数,并将该数字的当前计数存储在HashMap中。
我还有一个SSL服务器在监听请求。当收到一个请求询问“我们有多少个7”,我只需返回HashMap中的值。
现在我想添加逻辑,如果该数字出现0次,则等待直到该数字出现一次,并在那时返回计数。然而,由于Thread的run方法的限制必须是void类型,所以我很困惑。我想知道是否有任何方法可以将我的方法声明为始终启动新线程的方法,或者是否有更好的处理方法比我正在做的更好。以下是我的代码:
我还有一个SSL服务器在监听请求。当收到一个请求询问“我们有多少个7”,我只需返回HashMap中的值。
现在我想添加逻辑,如果该数字出现0次,则等待直到该数字出现一次,并在那时返回计数。然而,由于Thread的run方法的限制必须是void类型,所以我很困惑。我想知道是否有任何方法可以将我的方法声明为始终启动新线程的方法,或者是否有更好的处理方法比我正在做的更好。以下是我的代码:
private static volatile HashMap<Integer, Integer> occurenceMap= new HashMap<Integer, Integer>();
public synchronized static int getNumOccurrences(final Integer number) {
try {
(new Thread() {
public void run() {
Integer occurrences = occurenceMap.get(number);
if ( occurrences != null && occurrences > 0 ) {
// here I would like to just return occurences;
} else {
CountDownLatch latch = new CountDownLatch(1);
pendingList.put(number, latch);
latch.await();
// elsewhere in the code, I call countdown when I get a hit
pendingList.remove(number);
// once we've counted down, I would like to return the value
}
}
}).start();
} catch ( Throwable t ) { }
}
然而,我不能在run方法中使用返回语句。那么这怎样做最好呢?
谢谢!
join
,那么在线程完成之前,你的方法很快就会退出。这样它每次都会返回0
,只有在线程最终完成后才会被更新,而此时你的方法已经完成了。你需要在调用该方法的地方创建一个列表,但是你不需要在内部创建一个列表。每次方法调用都会创建一个新的线程,而不是重复使用同一个线程。 - corsiKajoin
强制方法说“在返回之前等待此线程完成”。 - corsiKajoin
的工作方式吗? - sally