java - 如何让Java runnable从主线程而不是后台线程调用回调?

标签 java multithreading

我正在做一些思想实验,这是我的 MyRunnable 类:

class MyRunnable implements Runnable {

    private final Integer mNumber;
    private final CompleteHandler<Integer> mCallback;

    public MyRunnable(Integer i, CompleteHandler<Integer> ch) {
        mNumber = i;
        mCallback = ch;
    }

    public void run() {

        int sum = 0;

        for (int i = 1; i <= mNumber; i++) {
            sum += i;
        }
        mCallback.onFinished(sum);
    }
}

这将由我在主线程上的 execute() 方法下创建的后台线程执行

public class Demo implements CompleteHandler<Integer>{

    public static void main(String[] args) {
        Demo d = new Demo();
        d.execute();
    }

    @Override
    public void onFinished(Integer i) {
        String threadName = Thread.currentThread().getName();
        System.out.println(threadName);    // thread-0
    }

    public void execute() {
        MyRunnable mr = new MyRunnable(10, this);
        Thread t = new Thread(mr);
        t.start();
    }
}

如您所见,任务完成时,MyRunnable 调用onFinished()。有什么办法可以让后台线程在主线程上调用它吗?我知道我可以使用可调用对象做类似的事情,但现在我想知道可运行对象是否可以这样做,

谢谢

最佳答案

Johannes: Take a look at CompletableFuture...

Brendon: I'm more interested in seeing how it work on code

这是一个忽略异常问题的简单实现。 (如果它实际上不是有效的 Java 代码,请原谅我。)

class CompletableFuture<ValueType> {
    private Object lock = new Object();
    private boolean is_completed = false;
    private ValueType completed_value;

    public synchronized void complete(ValueType v) {
        completed_value = v;
        is_completed = true;
        notifyAll();
    }

    public synchronized ValueType await() {
         while (! is_completed) {
              wait();
         }
         return completed_value;
    }
}

这个想法是,客户端线程创建一个 CompletableFuture 实例,cf,并以某种方式将其传递给服务器线程,可能还有其他参数告诉服务器线程要做什么。然后客户端线程就会去执行其他不相关的事情。

同时,服务器线程执行工作,最终生成结果r,然后调用cf.complete(r) .

在某个时刻,客户端线程完成了它正在执行的其他操作,现在它需要结果,因此它调用 cf.await()。此时会发生以下两种情况之一:

  1. 服务器已经设置了 is_completed 标志,在这种情况下,客户端会立即获取结果,或者
  2. 服务器尚未完成,因此客户端进入 wait() 循环等待。
<小时/>

当您查看应用程序代码时,您通常不会看到客户端线程创建 Future 对象或将其传递给其他线程的部分。当客户端向线程池提交任务时,这通常是在库调用内部完成的。

关于java - 如何让Java runnable从主线程而不是后台线程调用回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58225483/

相关文章:

java - 检测未知 (0x0) 键的名称/键码

java - 尝试将 HashSet 元素与 List 中的元素进行比较

java - 为什么程序在从方法和静态对象中删除 Synchronized 关键字时显示相同的输出?

java - Java 8 流是原子的吗?

c - 当使用free()时,内存使用不会减少

Java打印页面

java - 使用jxl如何处理文件名变化?

java - 交通信号应用程序需要多少个线程?

Java - 根据请求关闭并发线程

c# - 处理存储过程