方法是否在线程中绑定到线程?

时间:2013-10-28 14:15:19

标签: 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;
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);
    }
}

package customlogger;

/**
 *
 * @author student
 */
public interface LogConsumer {
    public void consume(String message);
}

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

现在假设我想用simpleLogger.log(message);记录大量消息,这是否会损害我程序本身的性能?

我在自己的线程中运行CustomLogger,这样就不应该(直接)影响我的程序的性能,但是记录器完成System.out.println(message)的情况也是如此吗? / p>

1 个答案:

答案 0 :(得分:1)

如果您这样做,它不会影响主线程的性能。但是我会重新考虑使用现有的日志记录框架,因为我没有看到你创建了一些与log4j无关的东西......例如......