我试图在多线程程序中用Java编写Observe模式来开发自己的日志程序。我的程序在任何Java类中使用,可以创建Logger
类,并向记录器写入消息。 Logger类将调用logger管理器类,它是一个Singleton类,它还有一个私有类,它是线程,在执行调度程序时运行,所以我在私有构造函数中保留了该执行。
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添加到两个主题的线程,一个主题是我上面粘贴的调度程序,即Timer在每个指定的时间运行而不是LogWriter
需要创建一个新的日志文件,而另一个目的是在队列中添加消息时。代码未按预期工作:
*调度程序代码未运行,我也尝试使用execute
。私有构造函数没有被调用
*并不总是调用线程初始化器
*观察模式:我使用过J2SE接口,即Observable
和Observe
,但它们没有按预期工作
请帮帮我。
答案 0 :(得分:1)
制作人 - 记录器的消费者方式(未完整且未完全测试) - 将留给您
这仅用于演示目的,并显示了执行异步记录的一种方法
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();
}