-1

独自のロギング プログラムを開発するために、マルチスレッド プログラムで Java で Observe パターンを記述しようとしています。私のプログラムは任意の 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 を 2 つのサブジェクトに追加するスレッドです。1 つのサブジェクトは上に貼り付けたスケジューラです。つまり、タイマーは指定された時間ごとに実行されLogWriter、新しいログ ファイルを作成する必要があることを通知します。もう 1 つの目的は、メッセージが追加されたときです。待ち行列。コードが期待どおりに動作しない: * スケジューラ コードが実行されていませんexecute。同様に試してみました。プライベート コンストラクターが呼び出されていない * スレッド イニシエーターが常に呼び出されているとは限らない * パターンを観察する: J2SE インターフェイスを使用しましたが、期待どおりに動作ObservableObserveていません

私を助けてください。

4

1 に答える 1

1

Producer - Logger の消費者向けの方法(不完全であり、完全にテストされていません) - それはあなたに任せます

これはデモンストレーションのみを目的としており、ASYNCHRONOUS ロギングを行う 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();

    }
于 2012-12-02T11:54:34.190 に答える