多线程Java:每隔几秒创建一个文件
我正在使用ScheduledThreadPoolExecutor每隔fileIntervalInSeconds创建一个文件:
executorService = new ScheduledThreadPoolExecutor(1);
executorService.scheduleAtFixedRate(new Runnable()
{
@Override
public void run()
{
File file = new File(fileName);
if (file.exists())
{
Log.debug("creating new file");
openFileWriter(file);
}
}
}, fileIntervalInSeconds, fileIntervalInSeconds, TimeUnit.SECONDS);
}
private void openFileWriter() throws FileSystemNotificationException
{
// 1 - close exist writer
writer.close();
// 2 - rename to backup file name
...
// 3 - create new file
FileWriter writerFile = new FileWriter(fileName, true);
writer = new PrintWriter(writerFile);
}
我一直在给文件写警告信息:
private synchronized void writeLine(String line) throws InterruptedException
{
writer.println(line);
}
我的问题是:
- 当writer未关闭时,如何确保我正在使用它?(writer.close())
- 如何等待ScheduledThreadPoolExecutor完成文件创建,然后再开始写入
# 1 楼答案
您只需在write方法中每小时创建一个新文件。你会有一些轻微的时间检查开销,但这应该可以忽略不计。下面的示例将每小时创建一个新的日志文件,并在文件名前面添加以毫秒为单位的时间。你可以根据自己的情况设定时间
# 2 楼答案
在写入之前检查文件是否存在如何。不需要反向绑定线程或同步
# 3 楼答案
让一个单独的线程来处理日志记录,而不是那个相当复杂的构造,怎么样
然后初始化记录器一次:
然后你可以在任何地方以线程安全的方式使用它,比如:
您不需要停止记录器,因为Java将使用try构造确保文件正确关闭。但是,如果你愿意,你可以这样阻止它:
现在,您可以通过单线程方式执行所有文件操作,因为任何时候只有一个线程访问日志文件
# 4 楼答案
你有两个选择:
例如: