方法一:轮训

比如主线程要等子线程在得到变量“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线程任务执行结束了");
}
}

输出结果如下:

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()方法都是在子线程中执行的。就是说虽然两个回调方法都成功执行了,但是执行所用的线程确是不正确的。

Android 如何监听一个线程的开始和结束的更多相关文章

  1. Android 如何监听返回键,弹出一个退出对话框

    android 如何监听返回键点击事件,并创建一个退出对话框, 防止自己写的应用程序不小心点击退出键而直接退出.自己记录下这个简单的demo,备用. public class BackKeyTest ...

  2. [转]Android 如何监听返回键,弹出一个退出对话框

    本文转自:http://blog.csdn.net/sunnyfans/article/details/8094349 Android 如何监听返回键点击事件,并创建一个退出对话框, 防止自己写的应用 ...

  3. Android来电监听和去电监听

    我觉得写文章就得写得有用一些的,必须要有自己的思想,关于来电去电监听将按照下面三个问题展开 1.监听来电去电有什么用? 2.怎么监听,来电去电监听方式一样吗? 3.实战,有什么需要特别注意地方? 监听 ...

  4. Android如何监听蓝牙耳机的按键事件

    写在前面: 直接想要代码很简单,你直接把滚动条拉到最底端就可以看到.如果想要十分地了解为什么,那就按照我规划的一步一步来理解.以下测试环境以手头上有的「Bluedio + 红米手机」. 1.蓝牙耳机的 ...

  5. Android如何监听蓝牙耳机的按键事件(转)

    源: Android如何监听蓝牙耳机的按键事件 写在前面: 直接想要代码很简单,你直接把滚动条拉到最底端就可以看到.如果想要十分地了解为什么,那就按照我规划的一步一步来理解.以下测试环境以手头上有的「 ...

  6. Android实时监听网络状态

    Android实时监听网络状态(1)   其实手机在网络方面的的监听也比较重要,有时候我们必须实时监控这个程序的实时网络状态,android在网络断开与连接的时候都会发出广播,我们通过接收系统的广播就 ...

  7. xamarin android如何监听单击事件

    在xamarin android单击事件是最基础的事情,看过菜鸟上的android教程时,java写的都是监听事件,为一个按钮,单选按钮.多选按钮的单击事件有三种,前面两种用的非常普遍,也很简易,我这 ...

  8. Android 监听 Android中监听系统网络连接打开或者关闭的实现代码

    本篇文章对Android中监听系统网络连接打开或者关闭的实现用实例进行了介绍.需要的朋友参考下 很简单,所以直接看代码 复制代码 代码如下: package xxx; import android.c ...

  9. Android实现监听控件点击事件

    Android实现监听控件点击事件 引言 这篇文章主要想写一下Android实现监听点击事件的几种方法,Activity和Fragment实现起来有些方法上会有些不同,这里也略做介绍. 最近一直在忙一 ...

随机推荐

  1. 微信小程序云函数 添加数据到数据库

    1.新建小程序,建立云开发快速启动模板 这里和普通小程序的区别有三点 一是 project.config.json写上云函数所在目录"cloudfunctionRoot": &qu ...

  2. 【NOIP2013】转圈游戏 快速幂

    题目大意:给你四个整数$n,m,k,x$,求$(x+m\times 10^k)%n$. 直接一个快速幂就好了,注意开$long\ long$. #include<bits/stdc++.h> ...

  3. 转 ZFC公理系统

    http://blog.sina.com.cn/s/blog_5d045b5c0100spld.html 首先,ZFC集合论中的公理大致分为3组: 1.外延公理. 2.子集公理模式.无序对公理.并集公 ...

  4. 9、如何在Xamarin中进行iOS真机调试和发布

    本文主要引导用户如何使用真机调试和编译发布. 概述 使用前的准备: 1.一台IPhone设备  或者IPad 都行看你自己 2.一台Mac主机和搭建好对应的xamarin.ios 开发环境 3.开发者 ...

  5. LINUX 下 NMAP 内网扫描

    #1.扫描内网存活主机 nmap -sP 10.2.24.* |grep for > tmp #2.扫描主机端口 nmap -A -T4 192.168.1.2 #3.扫描主机的所有端口 nma ...

  6. 【链表】Remove Duplicates from Sorted List II(三指针)

    题目: Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct  ...

  7. 数据库--oracle图形化管理工具和新增自定义用户

    oracle数据库图形化管理工具: 1 navicat工具很小,操作mySQL和SQLServer非常好用,但对于oracle体验性就有点差,要自己下载编码和替换oci文件.下面是解决的方法教程链接 ...

  8. python3 连接HBase

    db_url = 'http://47.93.89.99:8765' from traceback import format_exc import phoenixdb as pb class Uti ...

  9. VM CentOS7 网络配置问题汇总

    0. 前言 在进行配置之前,我们首先需要明确几个概念: I. VM的网络连接方式 ①. 桥接模式(Bridge)   此模式下,VM centOS 在网络中作为一台独立主机存在,它可以访问网络中的任何 ...

  10. mac上用ssh登录服务失败的排查方法

    ssh -vvv user@ip/ traceroute ip telnet ip 22 ping