Cru*_*her 5 java synchronization file
我System.out通过调用System.setOut和更改为打印到文件System.setErr.
每天午夜,我们都想重命名(存档)当前日志文件,并创建一个新文件.
if (out != null) {
out.close();
out = null;
File f = new File(outputfilename);
f.renameTo(new File(dir.getPath().replace(".log", "-" + System.currentTimeMillis() + ".log")))
StartLogFile();
}
Run Code Online (Sandbox Code Playgroud)
的StartLogFile():
if (out == null) {
out = new FileOutputStream(outputfilename, true);
System.setOut(new PrintStream(out));
System.setErr(new PrintStream(out));
}
Run Code Online (Sandbox Code Playgroud)
我已经把异常处理了.
我担心的是,如果某些东西试图在两者之间打印out.close()和setOut/ setErr我将错过一个日志.
我真正的问题是,如何通过其他调用来创建这个原子System.out.println?我正在考虑尝试
synchronized (System.out) {
}
Run Code Online (Sandbox Code Playgroud)
但我真的不确定这里的内在锁是否有任何作用.特别是因为我在操作期间使out对象无效.
有谁知道我怎么能确保在这里正确同步?
在关闭旧的之前我会创建新的:
PrintStream old = System.out;
out = new FileOutputStream(outputfilename, true);
System.setOut(new PrintStream(out));
old.close();
Run Code Online (Sandbox Code Playgroud)
这样,在PrintStream创建和分配新旧之前,旧的不会关闭.在PrintStreamSystem.out中始终有一个有效的.
不需要synchronized块,因为一切都在同一个线程中.
是的,您可以通过这种方式实现正确的同步。这是一个示例测试。
@Test
public void test() throws InterruptedException {
new Thread(()->{
while(true){
System.out.println("printing something");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
}
}
}).start();
Thread.sleep(500);
synchronized (System.out){
System.out.println("changin system out");
Thread.sleep(2000);
System.out.println("finished with sysout");
}
Thread.sleep(2000);
}
Run Code Online (Sandbox Code Playgroud)
输出将是:
printing something
printing something
printing something
printing something
printing something
changin system out
finished with sysout
printing something
printing something
printing something
printing something
printing something
printing something
printing something
printing something
printing something
printing something
printing something
printing something
printing something
printing something
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
878 次 |
| 最近记录: |