gpt4 book ai didi

java - 本地线程变量或新线程 - Java

转载 作者:行者123 更新时间:2023-12-01 18:57:40 24 4
gpt4 key购买 nike

我有一个实现 Runnable 的类。出于日志记录的原因,我想知道用于运行该类的线程。在这种情况下最好这样做

public class WebSocketHandle implements Runnable {
private Thread myThread; // access to thread for logging

public void start() {
myThread = new Thread(this);
myThread.start();
}
}

然后在创建这些的方法中我做了类似的事情:

    public void newSocket(Socket socket)
{
WebSocketHandle handle = new WebSocketHandle(this, socket,_identity);
_sockets.add(handle);

EventLog.write("Socket assigned for new connection (" + _sockets.size() + ") " + handle.toString() + ". No value received yet yet...", getClass().getName(), "register");

// Start thread listening for data
new Thread(handle).start();
}

或者最好有类似的东西:

public class WebSocketHandle implements Runnable {
private String myThread;

public void setThreadOwner(string threadId) {
myThread = threadId;
}
}

然后它会这样使用:

WebSocketHandle handle = new WebSocketHandle();
Thread newThread = new Thread(handle);

newThread.start();

handle.setThreadOwner(handle.toString());

我忍不住觉得第二种选择是更好的做法,但编写的代码似乎更笨拙?

编辑:回应亚伦的评论:

  1. 这是用于 Web 服务器套接字处理代码,因此线程将无限期地运行。我没有考虑过使用 ThreadPools,所以也许这是我需要考虑的事情

  2. 我在 WebSocketHandle 类中记录各种 Activity (即接收和发送的数据),因此我想将日志记录事件与其运行的 Thread 实例联系起来。为此,我发现最简单的方法是将 thread.toString() 记录为日志输出的一部分。

最佳答案

您只需调用Thread.currentThread()即可获取当前正在执行代码的线程。

为了帮助识别线程,请使用new Thread("some有用的名称");

[编辑] 您的两种方法都有一些缺点。第一种方法总是创建一个线程,因此您无法在线程池中执行可运行程序。最终,您会想要这样做。不幸的是,当您发现这样做时,您的应用程序将变得非常复杂并且很难更改。

而且“线程”对你帮助不大;哪个线程启动某事通常无关紧要。在查找错误时,您想知道哪段代码执行了某个方法。因此,将 Logger 传递给 start() 更有意义。

也就是说,“访问线程进行日志记录”是什么意思? start() 中创建的匿名线程包含哪些可能对日志记录有用的信息?由于它有一个生成的名称,并且您仍然不知道谁调用了 start(),因此第一种方法对我来说看起来完全没用。

第二种方法允许您为 Runnable 指定一个名称,但是 a) 它不会编译,b) 也没有任何意义(更不用说变量名称令人困惑的事实) )。

要获取某物的类,可以调用getClass().getName();使用 setter 设置实例的类名是没有意义的。因此,第二种方法是危险的困惑,它违反了 DRY principle .

此外,它不会为您提供太多有用的日志记录信息:它不会告诉您谁创建了 MyClass 实例以及您是否需要 MyClass 的记录器>,您可以简单地使用这一行:

private Logger log = LoggerFactory.getLogger(getClass());

不需要 setter 。

所以我的结论是这两种方法都应该避免。

关于java - 本地线程变量或新线程 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13375022/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com