【发布时间】:2015-10-15 23:17:28
【问题描述】:
我有一个应用程序,它从多个序列化对象日志中读取对象并将它们交给另一个类进行处理。我的问题集中在如何高效、干净地读取对象并将它们发送出去。
代码是从旧版本的应用程序中提取的,但我们最终保持原样。直到上周才真正使用它,但我最近开始更仔细地查看代码以尝试改进它。
它打开 N 个ObjectInputStreams,并从每个流中读取一个对象并将它们存储在一个数组中(假设下面的inputStreams 只是对应于每个日志文件的ObjectInputStream 对象数组):
for (int i = 0; i < logObjects.length; i++) {
if (inputStreams[i] == null) {
continue;
}
try {
if (logObjects[i] == null) {
logObjects[i] = (LogObject) inputStreams[i].readObject();
}
} catch (final InvalidClassException e) {
LOGGER.warn("Invalid object read from " + logFileList.get(i).getAbsolutePath(), e);
} catch (final EOFException e) {
inputStreams[i] = null;
}
}
序列化到文件的对象是LogObject 对象。这是LogObject 类:
public class LogObject implements Serializable {
private static final long serialVersionUID = -5686286252863178498L;
private Object logObject;
private long logTime;
public LogObject(Object logObject) {
this.logObject = logObject;
this.logTime = System.currentTimeMillis();
}
public Object getLogObject() {
return logObject;
}
public long getLogTime() {
return logTime;
}
}
一旦对象在数组中,它就会比较日志时间并发送最早时间的对象:
// handle the LogObject with the earliest log time
minTime = Long.MAX_VALUE;
for (int i = 0; i < logObjects.length; i++) {
logObject = logObjects[i];
if (logObject == null) {
continue;
}
if (logObject.getLogTime() < minTime) {
index = i;
minTime = logObject.getLogTime();
}
}
handler.handleOutput(logObjects[index].getLogObject());
我的第一个想法是为每个文件创建一个线程,该线程读取并将对象放入PriorityBlockingQueue(使用自定义比较器,该比较器使用LogObject 日志时间进行比较)。然后另一个线程可能会取出这些值并将它们发送出去。
这里唯一的问题是一个线程可以将一个对象放入队列并在另一个线程可以将一个可能有更早时间的对象放入队列之前将其取出。这就是为什么在检查日志时间之前首先读取对象并将其存储在数组中的原因。
此约束是否禁止我实施多线程设计?或者有什么方法可以调整我的解决方案以提高效率?
【问题讨论】:
标签: java multithreading priority-queue