使用Runnable在Java中实现回调

我习惯用类似JavaScript或类似Erlang的语言编写代码,在那里我可以轻松地创建回调函数。 现在我必须用Java写一些东西。 我想出了如何执行这样的回调:

import java.util.*; class Demo extends Thread{ private int data; public void run(){ ask_for_data(new Runnable(){ public void run(){ on_data(); } }); } public void on_data(){ System.out.println("Async callback: " + data); } public void ask_for_data(final Runnable callback){ System.out.println("2"); Runnable r = new Runnable(){ public void run(){ data = get_data(); new Thread(callback).start(); } }; new Thread(r).start(); } public int get_data(){ try{ Thread.sleep(1000); } catch (Exception e) {}; return 42; } public static void main(String[] args) { Demo d = new Demo(); d.start(); } } 

问题是:这是正确的方法吗?

只需将接口(回调实现)传递给您的runnable,就像这样

 interface Callback { void callback(); // would be in any signature } class MyThread implements Runnable { Callback c; public MyThread(Callback c) { this.c = c; } public void run() { // some work this.c.callback(); // callback } } 

以及关于线程所需的一切的简单教程

你的代码非常复杂 – 你扩展了Thread ,在内部实现了Runnable ,在Runnable创建了另一个Thread 。 那不是正确的方法。

接口Runnable可以被视为一种命令设计模式 – 它是一个工作单元,它被设计为 “必须完成的”逻辑与线程机制分开

我不知道我是否正确地解决了你的问题,但从我的理解,你只是尝试将一些参数传递给在单独的线程中运行的回调。 那么为什么不介绍一些实现Runnable类(这是你要完成的工作单元)并通过构造函数传递一些工作参数。 我的意思是如下:

 public class MyUnitOfWork implements Runnable { private final Data data; public MyUnitOfWork(final Data data) { this.data = data; } public void run() { // do something with data } } 

后来:

 Thread t = new Thread(new Data(/* something */)); t.start();