簡體   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