从辅助线程在主线程上运行代码?

这是一个通用的Java问题,而不是Android问题!

我想知道如何从辅助线程的上下文中在主线程上运行代码。例如:

new Thread(new Runnable() {
        public void run() {
            //work out pi to 1,000 DP (takes a while!)

            //print the result on the main thread
        }
    }).start();

这种事情 - 我意识到我的例子有点差,因为在Java中你不需要在主线程中打印出一些东西,而且Swing也有一个事件队列 - 但是你可能需要在后台线程的上下文中在主线程上运行Runnable的一般情况。

编辑:为了进行比较 - 这是我在Objective-C中的做法:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0UL), ^{
    //do background thread stuff

    dispatch_async(dispatch_get_main_queue(), ^{
        //update UI
    });
});

提前致谢!


答案 1

没有通用的方法可以向另一个正在运行的线程发送一些代码,然后说“嘿,你,这样做”。您需要将主线程置于具有接收工作的机制并等待工作完成的状态。

下面是一个将主线程设置为等待从其他线程接收工作并在到达时运行它的简单示例。显然,你会想添加一种实际结束程序的方法,依此类推......!

public static final BlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>();

public static void main(String[] args) throws Exception {
    new Thread(new Runnable(){
        @Override
        public void run() {
            final int result;
            result = 2+3;
            queue.add(new Runnable(){
                @Override
                public void run() {
                    System.out.println(result);
                }
            });
        }
    }).start();

    while(true) {
        queue.take().run();
    }
}

答案 2

如果您使用的是Android,则使用Handler应该可以完成这项工作吗?

new Handler(Looper.getMainLooper()).post(new Runnable () {
    @Override
    public void run () {
        ...
    }
});

推荐