Java 线程和观察者模式

Java 线程和观察者模式,java,multithreading,design-patterns,thread-safety,core,Java,Multithreading,Design Patterns,Thread Safety,Core,我试图在多线程程序中用Java编写观察模式来开发自己的日志程序。我的程序用于任何Java类,可以创建记录器类,并向记录器写入消息。Logger类将调用Logger manager类,这是一个单例类,它还具有私有类thread,在调度程序运行时执行,因此我将该执行保留在私有构造函数中 private void LoggerManager() { System.out.println("IN CONSTRUCTOR"); executorThread.submit(new Cre

我试图在多线程程序中用Java编写观察模式来开发自己的日志程序。我的程序用于任何Java类,可以创建
记录器
类,并向记录器写入消息。Logger类将调用Logger manager类,这是一个单例类,它还具有私有类thread,在调度程序运行时执行,因此我将该执行保留在私有构造函数中

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”中有一个方法

logintiator
是一个线程,它将日志编写器添加到两个主题中,其中一个主题是我在上面粘贴的计划程序,即计时器在每个指定时间运行,而不是创建新日志文件的需要,而另一个目的是在队列中添加消息。代码未按预期工作: *调度程序代码未运行,我也尝试了
execute
。未调用该私有构造函数 *线程启动器并不总是被调用 *观察模式:我使用了J2SE接口,即
Observable
Observable
,但它们没有按预期工作


请帮帮我。

制作人-记录器的消费者方式(不完整且未完全测试)-将留给您

这只是为了演示,并展示了一种异步日志记录的方法

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

我接受了所有解决我问题的答案。我怎么能接受答案而不解决我的问题呢?好吧,我刚才说的。顺便问一下,你想让记录器异步吗?是的,你是对的。还有其他解决办法吗。请让我知道上述解决方案在单机版上运行良好。但是我也需要一个传统的任务,需要在日志文件中写入消息。每隔10分钟我也需要更改日志文件。消息应该按照请求的顺序发送,并且在创建文件时不应出现任何问题。是:)但有些情况下,如队列已满,我没有处理谢谢Narendra,它成功了,我已将您的类添加到我的类的根中,它开始工作。非常感谢您的帮助这就是我们在这里要做的:)很高兴我能帮助您@Kumar
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();

    }