2017-05-31 43 views
1

在Android中,我們有處理程序#後(可運行)方法從另一個發佈一個Runnable在普通的Java另一個線程

張貼一些代碼,主線程有可能使同樣的事情在普通的Java(例如而使用揮杆)?

解釋問題: 假設我們有兩個線程:ThreadA和ThreadB。兩者已經開始並且並行運行。而ThreadB希望ThreadA調用某個方法(同樣,ThreadA已經在運行)。

此外還有一個可選的問題(你可能不會回答): 如果可能的話,有人會向我解釋Handler究竟是如何做Android的。它如何能夠將一些代碼發佈到MainThread? Looper的目的是什麼?

+1

請張貼你想要做的更具體的例子。 –

+0

GV,不,我不做Android編程,但是我做了很多Swing編碼,包括使用後臺線程。 –

+0

@HovercraftFullOfEels你使用Android嗎?有一個類Handler。用法很簡單:新的Hanldler(Looper.getMainLooper())。post(new Runnable(){void run(){}});不管什麼線程現在是最新的,run()方法只會在MainThread中調用。 –

回答

2

解決您的其他問題:

你說「在Android中,我們有處理程序#後(可運行)方法從另一個張貼一些代碼,主線程」

這是不完全正確。如果線程B被初始化爲Looper,並且線程A對目標線程B具有對Handler的引用,您可以從任何線程A向任何線程B發佈一些代碼。

當您需要在UI線程上做一些事情,因爲UI線程已經有Looper,你可以從幾乎任何地方檢索它。靜態方法Looper.getMainLooper是爲主線程獲取Looper的一種方法。如果使用此Looper初始化Handler,則可以發佈Runnable或發送Message(但如果發佈Runnable,它也會被包裝爲Message),並且它將在UI線程上執行。

Looper,作爲名稱提示,基本上運行一個線程的非終止循環。 Looper有一個關聯的MessageQueue它不斷地檢查新的Messages.通過Handler初始化與Looper你可以排隊Messages在這個線程。 Messages按順序處理,具體取決於Messagewhen字段。

這是一個基本的實現彎針線的:

class LooperThread extends Thread { 
     public Handler mHandler; 

     public void run() { 
      Looper.prepare(); 

      mHandler = new Handler() { 
       public void handleMessage(Message msg) { 
        // process incoming messages here 
       } 
      }; 

      Looper.loop(); 
     } 
    } 

我建議你閱讀每棵G.B.的第5章Android Concurrency。它會讓你對Looper/Handler框架有一個全面的瞭解。在閱讀時瀏覽源代碼也很棒,它非常簡單且不言自明。

+0

我最近發佈了一個類似問題的答案,我更詳細地解釋了發佈消息的內幕:https://stackoverflow.com/a/44478689/2611340 –

0

範圍內擺動,你會用

https://docs.oracle.com/javase/8/docs/api/javax/swing/SwingUtilities.html#invokeLater-java.lang.Runnable- 

運行在主線程上的東西。

在一般的Java,一個ExecutorService就像是一個線程池,並允許您提交Runnable或贖回情況

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html 

然而,如果你不使用的ExecutorService或搖擺,沒有標準的Java API告訴另一個線程做些事情。