在不同的线程上执行每个日志记录请求

Executing each logging request on a different thread

我已经编写了一个基于观察者设计模式的自定义 MyLogger 库。我想要实现的是:每次调用 writeLog(LOG_LEVEL,"Text") 方法时,我都希望它在新线程中执行。有人可以建议实现这一目标的方法。至于我应该在哪里创建线程。

这是我的 Logger 调用的样子。

public class Logger extends Subject{
     void writeLog(String type, String message)
        {       setData(message);
                notifyy(type);
        }

}

这就是我调用 writeLog 的方式

appLogger.writeLog("ERROR", "This is error");

您可以使用 ExecutorService

// Somewhere in your logging framework
ExecutorService service = Executors.new...(); // Choose the one you want
...

public MessageRelayingTask implements Runnable {
    // private fields
    ...

    public MessageRelayingTask(String type, String message) {
         ...
    }

    @Override
    public void run() {
        setData(message);
        notifyy(type);
    }     
}

public class Logger extends Subject implements Runnable {
    void writeLog(String type, String message) {
        service.submit(new MessageRelayingTask(type, message));
    }
}

一些入门指南:

您可以像这样使用生产者-消费者模式:

public class Logger {

    /**
     * The ExecutorService runs the Thread that processes the logs.
     */
    private final ExecutorService loggingService = Executors.newSingleThreadExecutor();

    /**
     * A queue that contains the logs.
     */
    final BlockingQueue<YourLogObject> logs = new LinkedBlockingQueue<>();

    /**
     * Creates a new Logger object and starts the Thread that processes the logs.
     */
    public Logger() {
        loggingService.submit(new Runnable() {

            @Override
            public void run() {
                try {
                    for (;;) {
                        final YourLogObject log = logs.take();

                        // setData(log.getMessage());
                        // notify(log.getLevel());
                    }
                } catch (final InterruptedException e) {
                    e.printStackTrace();
                    return;
                }
            }

        });
    }

    /**
     * Creates a new YourLogObject from the given parameters and puts it at the end of the queueu.
     */
    public void writeLog(final String level, final String message) {
        final YourLogObject log = new YourLogObject(level, message);

        try {
            logs.put(log);
        } catch (final InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 
     */
    public void shutdown() {
        loggingService.shutdownNow();
    }

}

public class YourLogObject {

    private final String level;

    private final String message;

    public YourLogObject(final String level, final String message) {
        this.level = level;
        this.message = message;
    }

    public String getLevel() {
        return level;
    }

    public String getMessage() {
        return message;
    }

}