线程和观察者模式

问题描述 投票:0回答:1

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

请帮助我。

java multithreading design-patterns thread-safety
1个回答
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();

    }
© www.soinside.com 2019 - 2024. All rights reserved.