在我的服务器/客户端框架中,我有多个定义JSON对象,服务器端。因此,java.util.logging.Logger
是一个有用的线人。如果或者不是,则在初始引导,加载阶段期间,所述JSON文件或“对象”被成功创建。消息在控制台中回显,详细说明。完全像Logger对象那样。
在这里,我将从代码中给出一个示例,强化对在这些级别运行的这种记录器的需求; Level.INFO
& Level.SEVERE
。
此示例来自班级DefinitionLoader.java
。实现Runnable,如明显的run()
方法所暗示的那样。
public abstract void load() throws Throwable;
public abstract String file();
@Override
public void run() {
try {
long start = System.currentTimeMillis();
load();
long elapsed = System.currentTimeMillis() - start;
Server.getLogger().log(Level.INFO, "Loaded definitions for: "+file()+". It took "+elapsed+" milliseconds.");
} catch(Throwable e) {
e.printStackTrace();
Server.getLogger().log(Level.SEVERE, "Loaded definitions for: "+file(), e);
}
}
每个单一的JSON对象都被执行到&通过load()
/ file()
来自记忆。必要时,他们会被记录下来。
我和我的问题只有一个问题。 Java 8的日志记录功能。每个日志消息或成功加载的JSON文件的指示都是“吐出”或更好的术语,打印到控制台。产生侵入性的信息,只会导致任何假设性问题。我很乐意这样说,
所有定义都已成功加载。
一次,在控制台内,以及其他引导语言学。
在System.out
方法中只放置run()
属性而不是像这样记录它会产生什么影响?理想情况下,当您被轰炸时,日志记录不会造成伤害;
控制台输出
INFO: Initializing the Bootstrap...
Feb 23, 2018 10:01:40 PM com.MYPACKAGE.definition.loader.DefinitionLoader run
INFO: Loaded definitions for: ./DIRECTORY/definitions/SOMEJSONFILE.json. It took 344 milliseconds.
Feb 23, 2018 10:01:40 PM com.MYPACKAGE.definition.loader.DefinitionLoader run
INFO: Loaded definitions for: ./DIRECTORY/definitions/SOMEJSONFILE.json. It took 609 milliseconds.
Feb 23, 2018 10:01:40 PM com.MYPACKAGE.definition.loader.DefinitionLoader run
INFO: Loaded definitions for: ./DIRECTORY/definitions/SOMEJSONFILE.json. It took 2 milliseconds.
Feb 23, 2018 10:01:40 PM com.MYPACKAGE.definition.loader.DefinitionLoader run
INFO: Loaded definitions for: ./DIRECTORY/definitions/SOMEJSONFILE.json. It took 32 milliseconds.
Feb 23, 2018 10:01:40 PM com.MYPACKAGE.definition.loader.DefinitionLoader run
INFO: Loaded definitions for: ./DIRECTORY/definitions/SOMEJSONFILE.json. It took 125 milliseconds.
Feb 23, 2018 10:01:40 PM com.MYPACKAGE.definition.loader.DefinitionLoader run
INFO: Loaded definitions for: ./DIRECTORY/definitions/SOMEJSONFILE.json. It took 42 milliseconds.
Feb 23, 2018 10:01:40 PM com.MYPACKAGE.definition.loader.DefinitionLoader run
INFO: Loaded definitions for: ./DIRECTORY/definitions/SOMEJSONFILE.json. It took 47 milliseconds.
Feb 23, 2018 10:01:41 PM com.MYPACKAGE.Server main
INFO: The Bootstrap has been bound, SERVER is now online!
我尝试通过for loop
处理记录器。另外,我使用构造函数bool
传递了log(Level level, String msg, Object[] params)
参数。最后,我在网上找到处理我的情况的答案后感到惊讶。我发现的任何和唯一的线索,与记录垃圾邮件无关。只想说,谢谢陌生人和/或任何可以&愿意帮忙!
答案 0 :(得分:0)
可能的解决方案可能是倒计时锁存器。这基本上意味着每个线程都有一个机制来表示它已经完成了它的工作,并且调用线程可以等待所有线程完成。
的示例 class Driver2 {
void main() throws InterruptedException {
CountDownLatch doneSignal = new CountDownLatch(N);
Executor e = ...
for (int i = 0; i < N; ++i) // create and start threads
e.execute(new WorkerRunnable(doneSignal, i));
doneSignal.await(); // wait for all to finish
}
}
class WorkerRunnable implements Runnable {
private final CountDownLatch doneSignal;
WorkerRunnable(CountDownLatch doneSignal) {
this.doneSignal = doneSignal;
}
public void run() {
try {
doWork();
doneSignal.countDown();
} catch (InterruptedException ex) {} // return;
}
}
您可以在await
完成后添加日志消息,并检查每个线程是否已成功完成(通过让他们在某处写入结果,或直接检查它们上的公共属性)。