繁体   English   中英

将多线程转换为单线程的绝佳方法

[英]Elegant way to transform Multi-thread into Single-thread

1.我有主UI线程,它使用库函数。

MainUI {
    library.funcA(1);
    library.funcB(2,3);
}

我不希望主线程等待每个调用的结束。 同样,为每个调用创建新线程是无效的,并且不是线程安全的,因此我希望它们在另一个相同的线程上运行。 所以我用一个消息队列/处理程序创建了另一个线程。

MainUI {
    handler.post(new Message(FUNC_A,[1]));
    handler.post(new Message(FUNC_B,[2,3]));
}

但是似乎有开销,我每次都需要创建一个新的Message对象并在handleMessage()中再次对其进行解码。 此外,处理各种数量的打包/拆包参数看起来很丑陋。 我以为将所有函数都设为Runnable并将其发布到处理程序中,但是函数具有不同的参数,因此我需要制作新类来扩展Runnable类!

我目前的计划是将同步的关键字插入库中的每个函数中,以便线程一个一个地运行,但是我不喜欢创建/分解许多线程,因此会使系统变重(也不安全)。 我想听听意见。

2.如果从多个线程(不仅是主线程)调用该库,转换调用以在该库自己的单线程上运行的最佳方法是什么?

我认为,您当前的方法是使线程安全的可行选择。 但是,如果您想将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类的实例。

您可以这样使用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方法将是防止多个线程相互跳闸的最简单方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM