- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个实现 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());
我忍不住觉得第二种选择是更好的做法,但编写的代码似乎更笨拙?
编辑:回应亚伦的评论:
这是用于 Web 服务器套接字处理代码,因此线程将无限期地运行。我没有考虑过使用 ThreadPools,所以也许这是我需要考虑的事情
我在 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/
我是一名优秀的程序员,十分优秀!