线程和观察者模式

时间:2012-12-02 08:19:08

标签: java multithreading design-patterns thread-safety core

我试图在多线程程序中用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接口,即ObservableObserve,但它们没有按预期工作

请帮帮我。

1 个答案:

答案 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();

    }