Java 线程和观察者模式
我试图在多线程程序中用Java编写观察模式来开发自己的日志程序。我的程序用于任何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
记录器
类,并向记录器写入消息。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();
}