方法一:轮训
比如主线程要等子线程在得到变量“val”值的时候开始用“val”的值来进行工作,使用轮训的方法如下:
public classSubThread extends Thread{private boolean flag = false;//标志位,用来标识是否应该通知主线程或者其他对象改做事情了
@Overridepublic voidrun() {
super.run();for(int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName() + "do" + i + "thing");
}
flag= true;for(int i=5;i<10;i++){
System.out.println(Thread.currentThread().getName() + "do" + i + "thing");
}
}publicboolean getFlag(){returnflag;
}
}public classTest {public static voidmain(String[] args) {
SubThread subThread= newSubThread();
subThread.start();while(true){if(subThread.getFlag()){
System.out.println(Thread.currentThread().getName() + "do something ...");
doWork();break;
}
}
}private static voiddoWork() {
System.out.println(Thread.currentThread().getName() + "do work ...");
}
}
可以看出确实实现了效果,但是这种方法太low了,缺点如下:
(1)主线程循环判断标志位是浪费CPU的表现
(2)如果有另外的线程也需要判断,那也得在线程中写一个死循环,代码太无设计思想可言
,看到这里也许有有人已经想到另外一种方法——回调!
方法二,回调
回调就是调用别的对象的方法时把“自己”传进去,然后别的对象在某个时候调用“自己的方法”,代码如下
public interfaceThreadCallback {voidthreadStartLisener();voidthreadEndLisener();
}public classSubRunnable implements Runnable {privateThreadCallback mThreadCallback;publicSubRunnable(ThreadCallback threadCallback){this.mThreadCallback =threadCallback;
}
@Overridepublic voidrun() {
mThreadCallback.threadStartLisener();for(int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName() + "do something"+i);
}
mThreadCallback.threadEndLisener();
}
}public classThreadCallbackTest implements ThreadCallback{private static ThreadCallbackTest mThreadCallbackTest = newThreadCallbackTest();public static voidmain(String[] args) {
System.out.println(Thread.currentThread().getName() + "开始");new Thread(newSubRunnable(mThreadCallbackTest)).start();
}
@Overridepublic voidthreadStartLisener() {
System.out.println(Thread.currentThread().getName() + "线程,知道SubRunnable线程开始执行任务了");
}
@Overridepublic voidthreadEndLisener() {
System.out.println(Thread.currentThread().getName() + "线程,知道SubRunnable线程任务执行结束了");
}
}
输出结果如下:
main 开始
Thread-0 线程,知道SubRunnable线程开始执行任务了
Thread-0 do something 0
Thread-0 do something 1
Thread-0 do something 2
Thread-0 do something 3
Thread-0 do something 4
Thread-0 线程,知道SubRunnable线程任务执行结束了
发现threadStartLisener()方法和threadEndLisener()方法都是在子线程中执行的。就是说虽然两个回调方法都成功执行了,但是执行所用的线程确是不正确的。