我才刚刚开始学习Java线程。
到目前为止,我已经看到人们通常使用2种方法来创建它们,但是我不了解它们之间的区别:
1:
new Thread() {
@Override
public void run(){
//mycode goes here;
};
}.start();
2:
new Thread(new Runnable() {
@Override
public void run(){
//mycode goes here;
}
}).start();
那么,如果没有必要,为什么人们使用new Runnable()? 它只是强制您具有run()方法,但是如果您创建线程,那么不自己创建run方法是不合逻辑的吗? 还是我错了?
但是,为什么在创建匿名线程时使用new Runnable()? 像上面的第二个例子一样? 由于我已经看到了一些教程,所以我在网上找到了。
我只是问是否有这样做的理由。
我知道也可以通过其他方式创建线程:
(我不是在谈论实现与扩展!)
3:
Thread t1 = new Thread(new MyRunnable());
4:
MyThreadClass my1 = new MyThreadClass();
检查一下这说明了为什么在某些情况下首选使用runnable。
"可运行的实现"与"扩展线程"的可能重复
我不是在问更喜欢什么,而是在问人们为什么要使用新的Runnable。 就像我的示例一样,我想知道在构造函数new Runnable中使用Thread是否有区别(我不是在谈论使用MyRunnables)。
从Java 8开始,您可以使用lambda表达式执行此操作:new Thread(() -> { *code* }).start();
输入信息。 Havent还研究了Java8的Lamba表达式,但是也看到了类似的例子。
在某些情况下,当您已经有一个Runnable实例仅在其他线程中运行时,这可能会很有用。 例如,Runnable可用于封装命令设计模式。
在您的情况下,没有理由创建Runnable,因为它不会添加任何内容。
谢谢,因为我仍在学习Java并对其进行自我编程,所以Command Design Pattern对我而言毫无意义。 但是,如果您说它在某些情况下可能有用,那么请记住:)
Basically you need to understand that, if you have to modify the
behavior of Thread then you need to extend Thread class otherwise if
you just have to run some separate threads then you need to implement
the interface Runnable.
请在此处查看更多信息:https://stackoverflow.com/a/16489176/1129313
您永远不会修改线程的行为。
@Crazyjavahacking ...我在这里读过某处,请参阅此stackoverflow.com/a/16489176/1129313
@Crazyjavahacking .....任何评论请
您没有回答问题。 他在问别的东西。
哦,真的,请不要那样,并删除您的不赞成票。
基本上就是您的权利:可能更改现有代码时为extend-创建新内容时为implement。 但是,正如Crazyjavahacking所提到的,这在谈论threadsm时没有什么用。
您可能听说过线程池;我们在哪里重用线程来处理不同的作业(读取可运行对象)。 查看threadpoolexecutor API的提交方法。 那会给你一些想法。