java创建和使用匿名可运行类的最佳方法
我想为Runnable
使用一个匿名类。有两种方法,但我不知道它们是否做相同的事情:
方法一:直接使用Runnable
,然后调用run()
:
new Runnable() {
@Override
public void run() {
}
}.run();
方法二:使用start()
方法而不是run()
创建一个匿名Runnable
并粘贴到Thread
:
new Thread(new Runnable() {
@Override
public void run() {
}
}).start();
我认为方法二显然是正确的。但是,我不知道它是否和方法一做了相同的事情。我们可以直接在Runnable
上调用run()
方法吗
# 1 楼答案
正如其他人提到的,使用Thread类是正确的方法。然而,您还应该考虑使用Javas Executors框架来处理正在运行的线程
当然,直接使用线程是可以的。但一般建议(或首选)使用该框架。让Java为您处理好细节
# 2 楼答案
不,您通常不会直接在Runnable上调用
run()
,因为这样不会得到后台线程。如果你不想要也不需要后台线程,那么直接调用run()
,但是如果你想创建一个后台线程并从其中运行你的Runnable,你必须创建一个新线程,然后将Runnable传入它的构造函数,并调用start()
此外,还有其他完成此任务的方法,包括使用Executors和ExecutorServices,您应该研究它们的用途,因为它们比使用裸体线程对象提供了更大的灵活性和功能
此外,您还想了解一下Future接口和FutureTasks类的用法,它们类似于Runnables,只允许您在完成时返回结果。如果您使用了SwingWorker,那么您已经使用了未来的接口,但没有意识到这一点
# 3 楼答案
我想补充一下这个讨论(你已经得到了很好的答案)
如果您的可运行对象是无状态的,为了减少内存分配(占用时间+消耗一些内存——考虑一个应用程序极大地使用线程的情况),请考虑拥有一个静态字段来保存可运行对象。br/>
# 4 楼答案
在方法一中,它将像一个方法一样工作,作为可运行接口来实现和调用它,但不会创建后台线程。 事实上,当我们调用start方法时,它会导致响应线程开始执行,Java虚拟机会在内部调用该线程的run方法。因此,要启动线程,我们需要使用接口Runnable reference调用start方法。 在方法一中,我们甚至不能使用Runnable接口引用调用start方法,因为Runnable接口不支持start()方法。因此,必须创建Thread类的对象来启动线程执行
# 5 楼答案
请始终记住,Runnable只是您希望或能够在线程中运行的代码。匿名定义可运行代码的一种方法是:
然后你可以创建一个线程,并将你创建的Runnable传递给这个新线程,如下所示
调用Thread类的start()方法后,run()方法中的代码将在新创建的线程上运行
您还可以查看创建可运行对象的不同方式 here
# 6 楼答案
必须在
Thread
内执行Runnable
接口。如果您想找到另一种内联方式,即Thread
中的一段代码,请尝试: