我正在尝试在多线程程序中用Java编写观察模式来开发自己的日志记录程序。我的程序可以在任何Java类中使用,并且可以创建
Logger
类,并向记录器写入消息。记录器类将调用记录器管理器类,它是一个单例类,它还有一个私有类,它是线程,在执行时调度程序运行,所以我将该执行保留在私有构造函数中。
private void LoggerManager() {
System.out.println("IN CONSTRUCTOR");
executorThread.submit(new CreateLoggerFileForSpecifiedTime());
}
static LoggerManager getInstance() {
if (LOGMANAGER == null) {
synchronized (LoggerManager.class) {
if(LOGMANAGER == null){
System.out.println("IN MANAGER");
LOGMANAGER = new LoggerManager();
}
}
}
return LOGMANAGER;
}
接下来LoogerManager中有一个方法“writeMessageToLog”。
void writeMessageToLog(String componantName, String message,
Calendar messageCreationTime) {
LoggerDetails logDetails = new LoggerDetails(componantName, message,
messageCreationTime);
LogInitiater logIntiater = new LogInitiater(logDetails, noticeOfLoggerChange,
noticeOfMessageAdded);
executorThread.submit(logIntiater);
}
LogIntitiater
是一个将LogWriter添加到两个主题的线程,一个主题是我在上面粘贴的调度程序,即计时器在每个指定时间运行并通知LogWriter
需要创建一个新的日志文件,而另一个目的是在队列中添加消息的时间。代码未按预期工作:
* 调度程序代码未运行,我也尝试使用 execute
。该私有构造函数没有被调用
* 线程启动器并不总是被调用
* 观察模式:我使用了 J2SE 接口,即 Observable
和 Observe
,但它们没有按预期工作
请帮助我。
生产者-记录器的消费者方式(不完整且未完全测试)-将留给您
这仅用于演示目的,并展示了进行异步日志记录的一种方法
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
class Logger extends Thread{
private static Logger logger = null;
private BlockingQueue<String> logRequests;
private Logger(){
logRequests = new ArrayBlockingQueue<String>(10000);
}
public static Logger getLogger(){
if(logger == null){
synchronized (Logger.class) {
logger = new Logger();
logger.start();
}
}
return logger;
}
@Override
public void run() {
System.out.println("Starting to log");
while(true){
try {
System.out.println(logRequests.take());
} catch (InterruptedException e) {
//interrupted so stop logging
System.out.println("Logger exiting");
break;
}
}
}
public void info(String logMessage){
//not taken care of the case when queue becomes full
//will leave it to you
logRequests.add(logMessage);
}
}
主课
public static void main(String[] args) {
Logger.getLogger().info("This is info message");
System.out.println("I am free");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//stop the log
Logger.getLogger().interrupt();
}