2015-12-21 42 views
1

任何想法,爲什麼這部分代碼鎖定UI線程?Android - 從同步塊啓動線程

synchronized (executionMonitor) { 
    thread = new Thread(asyncCommand); 
    thread.setPriority(Thread.MIN_PRIORITY); 
    thread.setName(command.getClass().getSimpleName()); 
    thread.start(); 
    return; 
} 

我從UI塊開始線程。在調試期間,我發現該UI線程處於MONITOR狀態。但我不明白爲什麼?

executionMonitor被定義僅作爲對象:

private Object executionMonitor = new Object(); 

,而不是在其他地方使用。

+0

*我從UI塊* + *開始線程,並沒有在其他地方使用* ...那麼爲什麼你需要同步呢? – Selvin

+1

當你希望實現互斥時,你應該同步,爲什麼當你只有ui線程發射它時,你需要同步一個塊才能激發線程?放下你的同步塊,進一步說,如果你的主UI正在運行任務時遇到問題,請嘗試'runOnUiThread(Runnable action)'並從那裏開始任何東西,我也不明白爲什麼你從同步塊返回。線程和同步是一個複雜的問題,如果你沒有足夠的經驗,它會受到傷害。嘗試使用諸如'Executor'服務之類的內置對象。 – shaydel

+0

@Selvin - 這不是我的代碼,我試圖理解爲什麼UI被鎖定 – michalp

回答

0

嘗試返回到同步塊之外。

更新:

確認爲不是解決辦法 - Java將自動解除鎖定,即使return語句是synchronized塊內

+0

如果我刪除塊,那麼它的工作,但我的問題不是 - 如何修復。我想了解,爲什麼synchronized塊指示,直到執行線程回到這個類,UI才被阻塞。 – michalp

+0

真的很有趣。這是您在executionMonitor上同步的唯一行嗎? –

+0

你是說,只要將'return'語句移出同步塊?這將如何幫助? –

0

好吧。我發現,謝謝大家的回覆,問題是另一個愚蠢的同步塊 - 但在命令中。整個命令使用DBHelper的實例同步。