回调机制作为Java学习甚至是语言学习中一种很重要的思想,用处十分广泛,在Android的开发中有大量的回调实现,为了使回调更加明显,我们使用多线程来实现一个简单的回调机制,程序的逻辑如下:
首先通知Test1来计算1+....+100=? Test1新建了一个Tools线程去计算这个事情而自己在打印“...",当Tools计算好这个结果之后通知Test1设置好的回调函数来打印结果
程序如下:
测试函数如下
其中涉及到线程的手动结束,线程的数据传递等思想 很适合刚接触的人学习。
首先通知Test1来计算1+....+100=? Test1新建了一个Tools线程去计算这个事情而自己在打印“...",当Tools计算好这个结果之后通知Test1设置好的回调函数来打印结果
程序如下:
public class Test1 implements Runnable {
private Boolean flag = true;
private int n = 0;
public Test1(int n) {
// TODO Auto-generated constructor stub
this.n = n;
}
public void sum() {
// 2.sum()被run调用,通知Tools计算,并将自己作为参数传递进去(为方便传递n值和回调函数本身)
new Thread(new Tools(this)).start();
// 3.自己开始打印" . "
System.out.print("正在计算");
while (flag) {
System.out.print(".");
try {
Thread.sleep(400);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// System.out.println("计算结束");
}
public void Objects2(int sum) {
// TODO Auto-generated method stub
// 4受到通知 打印计算结果 并将flag设置为false 结束sum();
System.out.println();
System.out.println(sum);
this.flag = false;
}
@Override
public void run() {
// TODO Auto-generated method stub
sum(); 1.程序一开始运行的地方
}
public int getN() {
// TODO Auto-generated method stub
return n;
}
}
class Tools implements Runnable {
private Test1 test;
public Tools(Test1 test) {
// TODO Auto-generated constructor stub
this.test = test;
}
public void Objests() {
int sum = 0;
for (int i = 0; i < test.getN(); i++) {
sum += i;
}
test.Objects2(sum);
// 4'.计算完毕,调用Test1提供的回调方法并讲结果传进去
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Objests();// 3'.为了使结果明显 Tools线程启用后会自己进入sleep状态 当再次苏醒后调用计算方法
}
}
测试函数如下
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Test1 test = new Test1(100);
new Thread(test).start();
}
}
其中涉及到线程的手动结束,线程的数据传递等思想 很适合刚接触的人学习。