Java 方法是否在绑定到线程的线程中启动?
我有一个问题,因为我要开发一个简单但非常专业的日志系统,其他日志系统目前不适合我的需要 守则:Java 方法是否在绑定到线程的线程中启动?,java,multithreading,Java,Multithreading,我有一个问题,因为我要开发一个简单但非常专业的日志系统,其他日志系统目前不适合我的需要 守则: package customlogger; import java.util.ArrayList; import java.util.List; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.logging.Level; impo
package customlogger;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author student
*/
public class CustomLogger implements Runnable {
private BlockingQueue<String> queue;
private List<LogConsumer> consumers;
public CustomLogger() {
this.queue = new LinkedBlockingQueue<>();
this.consumers = new ArrayList<>();
}
@Override
public void run() {
while (true) {
try {
String message = queue.take();
for (LogConsumer consumer : consumers) {
consumer.consume(message);
}
} catch (InterruptedException ex) {
Logger.getLogger(CustomLogger.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
public void log(String message) {
queue.offer(message);
}
public void addConsumer(LogConsumer consumer) {
if (consumers.contains(consumer)) {
return;
}
consumers.add(consumer);
}
public void removeConsumer(LogConsumer consumer) {
if (!consumers.contains(consumer)) {
return;
}
consumers.remove(consumer);
}
}
创建代码:
LogConsumer systemOutConsumer = new SystemOutConsumer();
CustomLogger simpleLogger = new CustomLogger();
simpleLogger.addConsumer(systemOutConsumer);
Thread simpleLoggerThread = new Thread(simpleLogger);
simpleLoggerThread.start();
现在假设我想用simpleLogger.log(message)记录很多消息代码>,这会损害程序本身的性能吗
我在自己的线程中运行CustomLogger
,这样就不会(直接)影响程序的性能,但是对于由记录器完成的System.out.println(message)
,也是这样吗?这样做不会影响主线程的性能。但我会重新考虑使用现有的日志框架,因为我看不到您创建了任何与log4j不可能的东西,例如 如果定制框架的目标是实现异步日志记录,那么大多数框架都已经支持了这一点,从log4j到log4j2都有异步附加器。我真的会考虑到底是什么,你需要在冒险之前,这是一个坏主意,有一个单独的线程运行日志。在多线程环境中,线程id有助于查找相关的日志消息。线程Id是在多线程环境中查找日志事件列表的唯一标识符。可用的日志框架主要涵盖了所有可能的场景。你的要求是什么?是什么促使你自己写一本。啊,很抱歉给你带来了困惑,我还没有做专门的部分。到目前为止,几乎任何日志框架都可以很容易地实现这一点。
package customlogger;
/**
*
* @author student
*/
public class SystemOutConsumer implements LogConsumer {
@Override
public void consume(String message) {
System.out.println(message);
}
}
LogConsumer systemOutConsumer = new SystemOutConsumer();
CustomLogger simpleLogger = new CustomLogger();
simpleLogger.addConsumer(systemOutConsumer);
Thread simpleLoggerThread = new Thread(simpleLogger);
simpleLoggerThread.start();