時間のかかるタスクのために非同期リターンを実装しようとしています。そのため、タスク データは Q に挿入され、すぐに返されます。20 個のスレッドの束が、そのデータ キューからタスクを受け取ります。しかし、スレッドのデータがnullになっています。なぜだろうか。
コード セグメント (コードの関連部分のみ)
意味
private static LinkedList<Object[]> cacheQ = new LinkedList<Object[]>();
private static ArrayList<Thread> cacheThreads = null;
ワンタイム初期化
if (cacheThreads == null) {
cacheThreads = new ArrayList<Thread>();
for (i = 0; i < 20; i++) {
CacheThread cacheThread = readWriteOps.new CacheThread();
Thread thread = new Thread(cacheThread);
cacheThreads.add(i, thread);
thread.start();
}
System.out.println("CAche Threads Started!");
}
最初の Q に新しいタスクを追加する ( addFirst
)
public void arrayizeToCache(String key, CacheData value) {
synchronized (cacheThreads) {
Object[] tuple = new Object[SIZE] ;
tuple[KEY] = key ;
tuple[VALUE] = value ;
----NOT NULL----log.debug("CacheThread arrayizeToCache k"+key+"v"+value) ;
cacheQ.addFirst((Object[])tuple);
cacheThreads.notify();
}
}
スレッドの実際の作業
public class CacheThread implements Runnable {
@Override
public void run() {
System.out.println("CachedThread running!");
CacheData cacheStore = null;
while (true) {
try {
String key;
synchronized (cacheThreads) {
if (cacheQ.isEmpty()) {
log.debug("Cache Q waiting");
cacheThreads.wait();
}
if (cacheQ.isEmpty()) {
log.error("Cache List empty nothing to cache");
continue;
}
Object[] cacheData = (Object[]) cacheQ.removeLast();
key = (String) cacheData[KEY] ;
cacheStore = (CacheData) cacheData[VALUE];
----- HERE -----
//More code, but irrelevant for this question.
}
} catch (InterruptedException e) {
e.printStackTrace();
}
// log.debug(((Runnable) this).toString() +
// "Server : flush SUCCESS");
}
}
}
で-----HERE-----
null を取得していますcacheStore.getValue()
。ここで何が欠けていますか。基本的なもの。
QにはLinkedListを使用したので、構造的にはうまくいくはずです。リンクリストには、処理する必要があるデータが保持されます。複数のデータ要素があるため、オブジェクト配列を保持します。
編集 :
private static final int KEY = 0 ;
private static final int VALUE = 1 ;
private static final int SIZE = 2 ;
もう一度編集:これが私が配列化を呼び出す方法です
ReadWriteOperations.getInstance(this).arrayizeToCache(key,
new CacheData(subscription, SuperCache.NEVER_EXPIRE));
私の CacheData オブジェクト
public class CacheData {
private Object value ;
private Integer expiry = 0 ;
public CacheData(Object newValue) {
value = newValue ;
}
public CacheData (Object newValue, Integer newExpiry) {
// THIS LINE WAS MISSING value = newValue ;
expiry = newExpiry ;
}
public Object getValue() {
return value ;
}
public Integer getExpiry () {
return expiry ;
}
}
回答 : 値をまったく初期化していませんでした。もっと複雑なものになるだろうと思っていました。そして、ここは午前2時です:) @Grayに感謝します。