我正在实现我自己的SurfaceView,其中包含一个Thread对象,其目的是将各种图形对象绘制到Canvas。在SurfaceView的构造函数中,我设置了要绘制的对象,Thread对象(当前)仅根据需要将它们定位到Canvas。
我现在需要在用户执行特定操作(即Thread对象正在运行)之后更改在SurfaceView的构造函数中创建的对象之一(该对象是Bitmap)。这意味着应用程序的GUI线程与执行我的Thread对象的线程之间的通信。我发现this页面详细介绍了HandlerThread类的使用,非常适合我需要实现的目标。但是,我需要确定此类如何工作以确保没有内存一致性错误。
以下是我自己类的伪代码,为了清楚起见,已经删除了很多:
public MyThread extends Thread {
boolean _run = true;
public void run(){
// Create HandlerThread object
// Create Looper object
// Create Handler object
while (_run){
// DRAW the Bitmap in this loop
}
}
public boolean handleMessage(Message message){
/*
ALTER the Bitmap here as required
*/
}
}
public MyThread extends Thread {
boolean _run = true;
public void run(){
// Create HandlerThread object
// Create Looper object
// Create Handler object
while (_run){
// DRAW the Bitmap in this loop
}
}
public boolean handleMessage(Message message){
/*
ALTER the Bitmap here as required
*/
}
}
据我了解,handleMessage()
方法由执行run()
方法的同一线程执行。但是因为handleMessage()
改变了位图,而run()
绘制了位图。在线程返回handleMessage()
方法之前,我能确定run()
是否完整?
答案 0 :(得分:0)
不确定我是否理解这个问题?
你在这两种情况下扩展了一个常规的Thread类,它本身并没有做任何特别的事情。除非您指定run
和handleMessage
从不同的CALLING线程运行,否则进程以序列化方式执行。所以我的猜测是肯定的。这应该是一个相当直接的线程安全执行模式 - 如果你在同一个线程中调用handleMessage
和run
,那么就没有理由不应该同步它们。如果你从不同的线程调用这两个方法,(或者如果你非常担心并且在其他任何地方找不到答案),你可以在两个方法中使用synchronized(myLock)
来锁定对象监视器。 :
public MyThread extends Thread {
boolean _run = true;
public void run(){
synchronized(this) {
while (_run){
// DRAW the Bitmap in this loop
}
}
}
public boolean handleMessage(Message message){
synchronized(this){...}
}
}