从辅助线程运行在主线程的代码?(Running code on the main thread fr

2019-09-01 07:55发布

这是一个一般的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中,你不需要在主线程中打印出来的东西,那摇摆具有事件队列也 - 但一般情况下,你可能需要运行说一个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
    });
});

提前致谢!

Answer 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();
    }
}


Answer 2:

如果你是在Android上,通过处理器应该做的工作?

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


Answer 3:

一个古老的讨论,但如果是发送请求到主线程(一个不是相反方向)的事你也可以用期货做。 其基本目标是在后台执行的东西,当它完成后,得到的结果:

public static void main(String[] args) throws InterruptedException, ExecutionException {
    // create the task to execute
    System.out.println("Main: Run thread");
    FutureTask<Integer> task = new FutureTask<Integer>(
            new Callable<Integer>() {

                @Override
                public Integer call() throws Exception {
                    // indicate the beginning of the thread
                    System.out.println("Thread: Start");

                    // decide a timeout between 1 and 5s
                    int timeout = 1000 + new Random().nextInt(4000);

                    // wait the timeout
                    Thread.sleep(timeout);

                    // indicate the end of the thread
                    System.out.println("Thread: Stop after " + timeout + "ms");

                    // return the result of the background execution
                    return timeout;
                }
            });
    new Thread(task).start();
    // here the thread is running in background

    // during this time we do something else
    System.out.println("Main: Start to work on other things...");
    Thread.sleep(2000);
    System.out.println("Main: I have done plenty of stuff, but now I need the result of my function!");

    // wait for the thread to finish if necessary and retrieve the result.
    Integer result = task.get();

    // now we can go ahead and use the result
    System.out.println("Main: Thread has returned " + result);
    // you can also check task.isDone() before to call task.get() to know
    // if it is finished and do somethings else if it is not the case.
}

如果你的目的是做几件东西在后台和检索的结果,你可以在上面说,设置一些队列,也可以在几个期货(在需要时甚至从另一个未来开始一次全部或者开始一个新的,)分裂过程。 如果您存储在地图或列表,在主线程中初始化每一个任务,你可以检查您要随时期货和他们这样做时,你得到他们的结果。



Answer 4:

您可能需要使用“甚至分派线程”,其中大多数事件驱动的事情发生。 如果您使用的摆动,则:

    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            Your code here.
        }
    });

或者创建一个实现Runnable类,并将其传递到了invokeLater()。



Answer 5:

如果你使用JavaFX的,我强烈建议,那么你可以使用

    Platform.runLater(new Runnable() {
        @Override
        public void run() {
            alert(text);
        }
    });

从非UI线程内,并且从UI线程从你的线程返回执行的Runnable。



文章来源: Running code on the main thread from a secondary thread?