繁体   English   中英

Java中的匿名类扩展线程

[英]Anonymous class extending thread in Java

这是一个Java语法问题,但仅出于某些背景。

使用android,我创建了一个很小的应用程序,运行非常缓慢,并且经常崩溃,因为单击按钮时,onClick()方法更改了各种按钮的按钮图像。 这确实很笨拙而且很慢,我在网上搜索后发现问题很普遍,并且在onClick()方法中更改许多图像时,最好将它们放在单独的线程中。 一位善良的人为此提供了代码。

new Thread(new Runnable() {
                public void run() {
                    quest.post(new Runnable() {
                        public void run() {
                            correct = nextQ();

                        }
                      });

                    }

                  }).start();

nextQ()方法和“ quest” TextView是我的。 这与我的问题做什么无关紧要,但是nextQ进行数据库搜索并更新图像,并且在线程外运行它确实很慢且很崩溃。 现在,我将此代码复制并粘贴到我的代码中,并且运行良好。 一个快乐的结局。 但是我不习惯使用我不理解的代码。 而且我不太了解Java。 因此,我尽了最大的努力研究匿名内部类,但是我仍然对代码感到困惑。

因此,匿名类扩展了线程,并且它的参数使用了一个匿名类,实现了可运行的,其中放置了代码的“肉”。问题:1)为什么要这样做? 我可以理解使用线程OR可运行,但是为什么要一起使用呢? 2)如何运作? 我回到了线程和可运行的基础知识,但是我看不到您如何以这种方式一起使用它们。

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

您需要这样做,因为:

  • Runnable定义执行什么
  • Thread实际执行它。

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

因此,匿名类扩展了线程,

不,不是的。 它实现了Runnable。

1)我为什么要这样做? 我可以理解使用线程OR可运行,但是为什么要一起使用呢?

如果使用Runnable,则仍然需要以某种方式运行它,一种方法是创建一个新线程并将其提供给Runnable(在此完成)。

2)如何运作?

new Thread(runnable)创建一个新线程,然后您可以启动()。 它将在Runnable的run()方法中执行代码。

Runnable包含应执行的代码(一种替代方法是Callable )。

Thread控制代码的执行方式和时间(替代方法是ExecutorService或直接调用run()以便在当前线程上同步执行)

通常,(为了将这两个功能区分开),您不想扩展Thread,而只想实现Runnable或Callable。

可以扩展Thread并直接实现run(而不是让它委托给Runnable),但这有点老套了。 如果他们今天要重新设计Java API,则Thread可能不再实现Runnable。 线程与其说是可运行的,不如说是奔跑者。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM