这是一个Java语法问题,但仅限于某些背景。
使用android,我创建了一个非常慢且经常崩溃的小应用程序,因为当单击按钮时onClick()方法更改了各种按钮的按钮图像。它真的很笨拙而且很慢,我在网上搜索后发现问题很常见,而且在onClick()方法中更改大量图像时,最好把它们放在一个单独的线程中。有些人给出了这样做的代码。
new Thread(new Runnable() {
public void run() {
quest.post(new Runnable() {
public void run() {
correct = nextQ();
}
});
}
}).start();
nextQ()方法和“任务”TextView是我的。这与我的问题并不真正相关,但是nextQ会进行数据库搜索和更新图像,并且在线程外部运行它确实很慢且很崩溃。 现在我将此代码复制并粘贴到我的代码中,运行正常。一个快乐的结局。但我不习惯使用我不理解的代码。而且我不太了解Java。所以我尽可能地研究匿名的内部类,但我仍然被代码所困扰。
所以匿名类扩展了线程,因为它的参数使用了一个匿名类,实现了runnable,其中放置了代码的“肉”。 问题: 1)我为什么要这样做?我可以理解使用线程OR runnable,但为什么在一起? 2)这是如何工作的?我回到了线程和runnable的基础知识,但我不知道你是如何一起使用它们的。
答案 0 :(得分:2)
Runnable
接口Thread
类的构造函数。所以你没有扩展Thread,你只是实例化它,并传递一个参数。start()
线程。因此,将在新线程中调用传递参数的run()
方法。你需要这样做,因为:
Runnable
定义 执行的内容Thread
实际执行它。 您的疑惑是可以理解的,因为Thread
也是Runnable
。这就是为什么在Java 5中引入了executors framework,它将执行机制(执行程序)与执行代码(Runnable
或Callable
)分开。
答案 1 :(得分:2)
所以匿名类扩展了线程,
不,不。它实现了Runnable。
1)我为什么要这样做?我可以理解使用线程OR runnable,但为什么在一起?
如果你使用Runnable,你仍然需要以某种方式运行它,一种方法是创建一个新的Thread并将它提供给Runnable(这是在这里完成的)。
2)这是如何运作的?
new Thread(runnable)
创建一个新的Thread,然后你可以start()。它将在Runnable的run()方法中执行代码。
Runnable
包含应执行的代码(另一种选择是Callable
)。
Thread
控制代码执行的方式和时间(替代方法为ExecutorService
或直接调用run()以便在当前线程上执行同步执行)
一般情况下(并且为了保持这两个功能不同),你不想扩展Thread,你只想实现Runnable或Callable。
可以扩展Thread并直接实现run(而不是让它委托给Runnable),但这是一种老派。如果他们今天要重新设计Java API,那么Thread可能不再实现Runnable了。线程更像是一个Runner而不是Runnable。