Java中的匿名类扩展线程

时间:2010-11-05 12:01:07

标签: java multithreading

这是一个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的基础知识,但我不知道你是如何一起使用它们的。

2 个答案:

答案 0 :(得分:2)

  • 您正在创建Runnable接口
  • 的匿名实现
  • 您正在将该实现传递给Thread类的构造函数。所以你没有扩展Thread,你只是实例化它,并传递一个参数。
  • 然后你start()线程。因此,将在新线程中调用传递参数的run()方法。

你需要这样做,因为:

  • Runnable定义 执行的内容
  • Thread实际执行它。

您的疑惑是可以理解的,因为Thread也是Runnable。这就是为什么在Java 5中引入了executors framework,它将执行机制(执行程序)与执行代码(RunnableCallable)分开。

答案 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。