-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它们没有按预期工作

请帮我。

4

1 回答 1

1

生产者 - Logger 的消费者方式(不完整且未完全测试) - 将留给您

这仅用于演示目的,并显示了一种执行异步日志记录的方法

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

    }
于 2012-12-02T11:54:34.190 回答