1。 我有主UI线程,它使用库函数。
MainUI {
library.funcA(1);
library.funcB(2,3);
}
我不希望Main-Thread等待每次调用的结束。为每个调用创建新线程也是无效的,而且不是线程安全的,所以我希望它们在另一个相同的线程上运行。 所以我创建了另一个带有单个消息队列/处理程序的线程。
MainUI {
handler.post(new Message(FUNC_A,[1]));
handler.post(new Message(FUNC_B,[2,3]));
}
但似乎每次都需要创建新的Message对象并在handleMessage()中再次解码它。此外,处理打包/解包的各种参数看起来很难看。我认为将所有函数都设置为Runnable并将它们发布到处理程序,但函数有不同的参数,我需要创建扩展Runnable类的新类!
我目前的计划是将同步关键字插入库中的每个函数,以便线程一个接一个地运行, 但我不喜欢许多线程创建/消失,因此使系统繁重(也不是线程安全)。我想听听意见。
2。 如果从多个线程(不仅是主线程)调用库,那么将调用转换为在库自己的单线程上运行的最佳方法是什么?
答案 0 :(得分:0)
在我看来,您目前的方法是使线程安全的可行选择。但是,如果您想将Runnable传递给处理程序,则可以考虑重载Runnable类。这是伪代码
private Class MyRunner extends Runnable{
public MyRunner(){
//This is without any argument
}
public MyRunner(arg1){
//This is with 1 argument
}
public MyRunner(arg1,arg2){
//This is with 2 arguments
}
}
但是,您将创建许多MyRunner类的实例。
答案 1 :(得分:0)
您可以像这样使用Runnable:
int x = 1;
int y = 2;
// "a" and "b" are here to show how variable values can be sent to funcB.
// You could skip this and just have "funcB( 1, 2 )", of course.
final int a = x;
final int b = y;
handler.post( new Runnable() {
public void run() { library.funcB( a, b ); }
} );
处理程序位有点棘手。它必须运行循环线程才能从队列中运行每个Runnable。然后它必须有post
方法将事物放在队列中。某种形式的阻塞队列将是链接这两者的最简单方法,从而使您不必自己执行Object.wait / Object.notify。同步post
方法将是防止多个线程相互跳闸的最简单方法。