我有擴展SurfaceView的GraphicView。我需要它來繪製圖形。我還需要onTouchEvent。但問題是...我不知道該怎麼形容它:)這裏是我的代碼:如何同步線程:onTouchEvent和run()?
public class GraphicView extends SurfaceView implements Runnable {
private boolean mutexOpened = true;
public boolean onTouchEvent(MotionEvent me) {
if (mutexOpened) {
mutexOpened = false;
Log.d("mutex", "ACTION 1");
switch (action) {
case MotionEvent.ACTION_DOWN: {
int rnd = new Random().nextInt(40000) + 1000;
for (int i = 0; i < rnd; i++) {} // it's some long action :)
Log.d("mutex", "ACTION 2: down");
break;
}
}
Log.d("mutex", "ACTION 2: end");
mutexOpened = true;
}
}
public void run() {
while (true) {
if (mutexOpened) {
Log.d("mutex", "!!! RUN !!!!");
}
}
}
}
我用互斥技術,它(我想)有能力控制我的線程。但在日誌中我看到以下內容:
!!! RUN !!!!
ACTION 1
!!! RUN !!!!
ACTION 2: down
ACTION 2: end
但是爲什麼?爲什麼第二個「!!! RUN !!!!」當互斥鎖關閉時,在「動作1」和「動作2」之間運行?不可能! :)))
我想下一步該怎麼做:
public void run() {
while (true) {
if (mutexOpened) {
mutexOpened = false; // close mutex
Log.d("mutex", "!!! RUN !!!!");
mutexOpened = true; // open mutex
}
}
}
,但... FAIL :))的onTouchEvent永遠運行在所有:d)))是否有人知道如何解決這個問題?
@PBrando執行,我想你明白正確。它在第二個線程上運行,但我需要同步這些線程... :) – JavaRunner