gpt4 book ai didi

java - 如何同步线程: onTouchEvent and run()?

转载 作者:行者123 更新时间:2023-12-02 07:28:44 26 4
gpt4 key购买 nike

我有 GraphicView ,它扩展了 SurfaceView 。我需要它来绘制图形。我还需要 onTouchEvent。但问题是......我不知道如何描述它:)这是我的代码:

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

但是为什么?为什么第二个“!!!跑!!!”当互斥体关闭时在“ACTION 1”和“ACTION 2”之间运行?不可能! :)))

我尝试下一步:

public void run() {
while ( true ) {
if ( mutexOpened ) {
mutexOpened = false; // close mutex
Log.d( "mutex", "!!! RUN !!!!" );
mutexOpened = true; // open mutex
}
}
}

但是...失败:)) onTouchEvent 根本不会运行:D))) 有人知道如何解决这个问题吗?

最佳答案

您必须同步对 mutexOpened 的访问:run() 可能会在您将 mutexOpened 设置为 false 之前立即读取它,并且可能会打印 RUN!!!打印“ACTION 1”后立即。

使用Java关键字synchronized来同步对mutexOpened的访问。在 run() 上,您可以使用 wait(),它会在 sleep 阶段释放锁。

如果使用synchronized关键字,则根本不需要变量mutexOpened。

public class GraphicView extends SurfaceView implements Runnable {

synchronized public boolean onTouchEvent( MotionEvent me ) {


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" );

}


synchronized public void run() {

while ( true ) {
wait(100); // Wait 100ms and release the lock
Log.d( "mutex", "!!! RUN !!!!" );

}

}

}

另外,尽量不要在 GUI 线程中执行长操作(注释“这是一些长操作”):应该在单独的线程中执行

关于java - 如何同步线程: onTouchEvent and run()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13196905/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com