zie*_*ony 20 java asynchronous
我习惯用类似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();
}
}
Run Code Online (Sandbox Code Playgroud)
问题是:这是正确的方法吗?
小智 36
只需将接口(回调实现)传递给您的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
}
}
Run Code Online (Sandbox Code Playgroud)
和一切简单的教程,您需要了解线程 这里
你的代码非常复杂 - 你在内部扩展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
}
}
Run Code Online (Sandbox Code Playgroud)
后来:
Thread t = new Thread(new Data(/* something */));
t.start();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
48466 次 |
| 最近记录: |