Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 方法是否在绑定到线程的线程中启动?_Java_Multithreading - Fatal编程技术网

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