在Thread
实现类中使用本地Runnable
字段是否是一种糟糕的设计:
public class TestingThread implements Runnable {
Thread t;
public TestingThread() {
t = new Thread(this, "Testing thread");
}
public void start()
{
t.start();
}
...
发布于 2014-07-18 05:42:50
虽然这类问题显然是固执己见,但我会告诉你,为什么我认为这是一个设计缺陷。(事实上,我挑起了这个问题,所以也许我应该回答。)
Runnable
是一个保存将(或应该)在线程中执行的代码的对象。文件对此作了如下解释:
Runnable接口应该由其实例要由线程执行的任何类实现。
Runnable
接口的主要思想是将可执行代码与执行它的方法分开。在自己的线程中运行这样的代码有几种可能性。
其中一个可能性是Thread
类。从其文件中:
有两种方法可以创建一个新的执行线程。一种是将类声明为线程的子类。此子类应重写类Thread的run方法。然后可以分配并启动子类的实例。..。另一种创建线程的方法是声明实现Runnable接口的类。然后,该类实现run方法。然后可以分配类的实例,在创建Thread时作为参数传递,然后启动。
在我看来,你总是应该做后一件事。定义Runnable
接口的实现,将它们的实例传递给Thread
的构造函数,然后启动线程。示例:
class MyRunnable implements Runnable { ... }
void runMyCodeInOwnThread() {
Runnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();
}
在线程中执行Runnable
的另一种方法是Executor
,尽管您很可能使用ExecutorService
(实际上是Executor
的一个子类型)。实用工具类Executors
很可能用于检索executor服务。示例:
class MyRunnable implements Runnable { ... }
void runMyCodeInOwnThread() {
Runnable runnable = new MyRunnable();
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<?> future = executor.submit(runnable); // or simply "executor.execut(runnable);"
}
如果您没有将您的可运行性与如何执行它的方法联系在一起,那么您可以自由地使用任何一种机制,或者在将来需求提前时更改它。
然而,当我浏览这些类的文档时,我在示例中也看到了同样的机制。不过,我认为这不是一个好的设计。
发布于 2014-07-18 04:43:52
在另一个线程类中保留或使用本地线程变量是choice.But个人的事情,据我所知,这不是一个好的设计,除非您有这样做的特定要求,并且在您的线程class.You中使用这个本地线程变量几乎不需要在现实生活中的scenario.Hope中使用这种需求--这对您有帮助!
https://stackoverflow.com/questions/24825100
复制相似问题