Android 如何监听一个线程的开始和结束
方法一:轮训
比如主线程要等子线程在得到变量“val”值的时候开始用“val”的值来进行工作,使用轮训的方法如下:
public class SubThread extends Thread{
        private boolean flag = false;//标志位,用来标识是否应该通知主线程或者其他对象改做事情了
        @Override
        public void run() {
                super.run();
                for(int i=;i<;i++){
                        System.out.println(Thread.currentThread().getName() + " do " + i + "thing");
                }
                flag = true;
                for(int i=;i<;i++){
                        System.out.println(Thread.currentThread().getName() + " do " + i + "thing");
                }
        }
        public boolean getFlag(){
                return flag;
        }
}public class Test {
        public static void main(String[] args) {
                SubThread subThread = new SubThread();
                subThread.start();
                while(true){
                        if(subThread.getFlag()){
                                System.out.println(Thread.currentThread().getName() + " do something ...");
                                doWork();
                                break;
                        }
                }
        }
        private static void doWork() {
                System.out.println(Thread.currentThread().getName() + " do work ...");
        }
}
可以看出确实实现了效果,但是这种方法太low了,缺点如下:
(1)主线程循环判断标志位是浪费CPU的表现
(2)如果有另外的线程也需要判断,那也得在线程中写一个死循环,代码太无设计思想可言
,看到这里也许有有人已经想到另外一种方法——回调!
方法二,回调
回调就是调用别的对象的方法时把“自己”传进去,然后别的对象在某个时候调用“自己的方法”,代码如下
public interface ThreadCallback {
        void threadStartLisener();
        void threadEndLisener();
}public class SubRunnable implements Runnable {
        private ThreadCallback mThreadCallback;
        public SubRunnable(ThreadCallback threadCallback){
                this.mThreadCallback = threadCallback;
        }
        @Override
        public void run() {
                mThreadCallback.threadStartLisener();
                for(int i=;i<;i++){
                        System.out.println(Thread.currentThread().getName() + " do something "+i);
                }
                mThreadCallback.threadEndLisener();
        }
}public class ThreadCallbackTest implements ThreadCallback{
        private static ThreadCallbackTest mThreadCallbackTest = new ThreadCallbackTest();
        public static void main(String[] args) {
                System.out.println(Thread.currentThread().getName() + " 开始");
                new Thread(new SubRunnable(mThreadCallbackTest)).start();
        }
        @Override
        public void threadStartLisener() {
                System.out.println(Thread.currentThread().getName() + " 线程,知道SubRunnable线程开始执行任务了");
        }
        @Override
        public void threadEndLisener() {
                System.out.println(Thread.currentThread().getName() + " 线程,知道SubRunnable线程任务执行结束了");
        }
}
输出结果如下:
Android 如何监听一个线程的开始和结束的更多相关文章
- Android 如何监听返回键,弹出一个退出对话框
		android 如何监听返回键点击事件,并创建一个退出对话框, 防止自己写的应用程序不小心点击退出键而直接退出.自己记录下这个简单的demo,备用. public class BackKeyTest ... 
- [转]Android 如何监听返回键,弹出一个退出对话框
		本文转自:http://blog.csdn.net/sunnyfans/article/details/8094349 Android 如何监听返回键点击事件,并创建一个退出对话框, 防止自己写的应用 ... 
- Android来电监听和去电监听
		我觉得写文章就得写得有用一些的,必须要有自己的思想,关于来电去电监听将按照下面三个问题展开 1.监听来电去电有什么用? 2.怎么监听,来电去电监听方式一样吗? 3.实战,有什么需要特别注意地方? 监听 ... 
- Android如何监听蓝牙耳机的按键事件
		写在前面: 直接想要代码很简单,你直接把滚动条拉到最底端就可以看到.如果想要十分地了解为什么,那就按照我规划的一步一步来理解.以下测试环境以手头上有的「Bluedio + 红米手机」. 1.蓝牙耳机的 ... 
- Android如何监听蓝牙耳机的按键事件(转)
		源: Android如何监听蓝牙耳机的按键事件 写在前面: 直接想要代码很简单,你直接把滚动条拉到最底端就可以看到.如果想要十分地了解为什么,那就按照我规划的一步一步来理解.以下测试环境以手头上有的「 ... 
- Android实时监听网络状态
		Android实时监听网络状态(1) 其实手机在网络方面的的监听也比较重要,有时候我们必须实时监控这个程序的实时网络状态,android在网络断开与连接的时候都会发出广播,我们通过接收系统的广播就 ... 
- xamarin android如何监听单击事件
		在xamarin android单击事件是最基础的事情,看过菜鸟上的android教程时,java写的都是监听事件,为一个按钮,单选按钮.多选按钮的单击事件有三种,前面两种用的非常普遍,也很简易,我这 ... 
- Android 监听 Android中监听系统网络连接打开或者关闭的实现代码
		本篇文章对Android中监听系统网络连接打开或者关闭的实现用实例进行了介绍.需要的朋友参考下 很简单,所以直接看代码 复制代码 代码如下: package xxx; import android.c ... 
- Android实现监听控件点击事件
		Android实现监听控件点击事件 引言 这篇文章主要想写一下Android实现监听点击事件的几种方法,Activity和Fragment实现起来有些方法上会有些不同,这里也略做介绍. 最近一直在忙一 ... 
随机推荐
- NOIP2017滚粗记【上】
			Day0: NOIP前停课训练的最后一天,上午打了一场三题都见过的比赛,一窝人AK. 下午一群人在机房缓慢氧化,到了晚上因为比赛在我们学校打,所以所有的机房都断网了(百思不得其解为什么两个竞赛室也被断 ... 
- POJ 2385
			#include <algorithm> #include <cstdlib> #include <numeric> #include <iostream&g ... 
- h5博彩webapp项目实例|h5棋牌游戏|h5博彩app案例
			html5实现的博彩webapp.h5棋牌app实例,运用h5+css3+zepto+jQ+swiper+layer等技术进行布控开发,750px最大宽度适配手机端设备,采用flex+rem布局样式. ... 
- activity生命周期实例(不同启动模式)
			1.生命周期的几个阶段介绍: onCreate: 表示activity被创建,做一些初始化工作如调用setContentView去加载界面布局资源.初始化Acitivity所需数据等. onResta ... 
- 开发工具 -- PyDev的使用
			1.创建PyDev工程 2.创建源文件夹src 3.新建.py文件 其他注意事项 1.设置字体大小 2.显示行号Ctrl + F10 3.编码设置为UTF-8 4.最好将工程创建到默认工作空间 5.总 ... 
- MYSQL 复制详解
			MySql 复制介绍 MySQL复制允许将主实例(master)上的数据同步到一个或多个从实例(slave)上,默认情况 下复制是异步进行的,从库也不需要一直连接到主库来同步数据 MySQL复制的数据 ... 
- InterView之PHP
			PHP HTTP Keep-Alive的作用 作用 Keep-Alive:使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接.Web服务器 ... 
- Go 程序执行顺序
			在一个 go 程序中通常包含:包.常量.变量.init().main()等元素,如果同时存在多个包,包之间存在依赖关系,每个包中存在多个 init 函数,每个文件中存在多个 init 函数,那么问题来 ... 
- solidity如何拼接字符串?
			当你开始学习使用solidity开发以太坊智能合约之后,很快你会碰到一个问题: 一.在solidity中该如何拼接字符串? 可能你已经试过了,下面的代码试图把两个字符串使用相加的运算符连接起来,但是这 ... 
- 使用Mac命令别名,提升工作效率
			为系统添加命令别名可以提高我们的工作效率,告别命令繁琐,庸长的的烦恼. Mac的~/.bash_profile文件提供了为系统添加命令别名的地方.所以我们要操作的也是这个文件. 下面是修改~/.bas ... 
