【问题标题】:Elegant way to transform Multi-thread into Single-thread将多线程转换为单线程的优雅方式
【发布时间】:2012-07-17 00:13:42
【问题描述】:

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。 如果从多个线程(不仅是主线程)调用库,那么将调用转换为在库自己的单线程上运行的最佳方法是什么?

【问题讨论】:

  • 不,在 Android 框架中处理 View.java。它为每次触摸视图调用我的函数。我应该尽量少打扰。

标签: android multithreading thread-safety


【解决方案1】:

在我看来,您当前的方法是使线程安全的可行选择。但是,如果您想将 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. Runnable是接口2。Handler会调用MyRunner.run(),那么如何从MyRunner的构造函数中动态改变run()方法的动作呢?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 2016-08-27
    • 2019-11-11
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多