android 线程 wait notify
线程状态
1.程序通过Thread t = new Thread(),调用t.start()启动一个线程,使该线程进入可运行(Runnable)的状态。
2.由JVM的决定去调度(Scheduler) 在可运行状态(Runnable)下的线程,使该线程处于运行 (Running) 状态,由于JVM的调度会出现不可控性,即不是优先级高的先被调用,可能先调用,也可能后调用的的情况。运行状态(Running)下,调用礼让 yield()方法,可以使线程回到可运行状态(Runnable)下,再次JVM的调度(并不依赖优先级)。
3.线程在Running的过程中可能会遇到 ①睡眠(sleeping)、②等待(waiting)、③阻塞(Blocked)
①.调用join()和sleep()方法,sleep()时间结束或被打断,join()中断,IO完成都会回到Runnable状态,等待JVM的调度。
②.调用wait(),使该线程处于等待池(wait blocked pool),直到notify()/notifyAll(),线程被唤醒被放到锁池(lock blocked pool ),释放同步锁使线程回到可运行状态(Runnable)
③.对Running状态的线程加同步锁(Synchronized)使其进入(lock blocked pool ),同步锁被释放进入可运行状态(Runnable)。
4.线程run()运行结束或异常退出,线程到达死亡状态(Dead)
sleep和wait的区别有:
1,类:这两个方法来自不同的类分别是Thread和Object
2,锁:最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3,域:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
- synchronized(x){
- try {
- x.wait();或者x.notify()
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
注意:对象x不能是基本类型,应该为可引用类型或者javabean
4,停:其实两者都可以让线程暂停一段时间,但是本质的区别是一个线程的运行状态控制,一个是线程之间的通讯的问题
.notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
notifyAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
java中对Object的wait()和nofity(),在object中有一个wai()t队列,一旦拥有该object的线程调用了该方 法,线程状态将从running 变为 waiting 。只有在其他线程调用了该object的notify(),将随机的从wait队列中挑选一个线程(或者notify()待定全部线程),将其状态从 waitting 变为 runningable。如果当前对象的wait队列没有线程,则不产生影响。
在两个线程协同作用的场景中,至少要保用两对wait() notify()函数,否则不能保证其顺序性,比如消费者生产都模型。
- package com.wmz.helloworld;
- import java.util.Random;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- public class Demo extends android.app.Activity {
- private class Token {
- private String flag;
- public Token() {
- setFlag(null);
- }
- public void setFlag(String flag) {
- this.flag = flag;
- }
- public String getFlag() {
- return flag;
- }
- }
- private Token token = null;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.demo);
- Button btn = (Button) findViewById(R.id.button1);
- token = new Token();
- if(token.getFlag() ==null)
- Log.v("A","the token flag value is null");
- else
- Log.v("A","the token flag value is"+token.getFlag());
- btn.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- // TODO Auto-generated method stub
- WorkThread workthread = new WorkThread();
- workthread.start();
- Random r=new Random();
- for (int i = 0;i<10; i++) {
- try {
- Thread.sleep((r.nextInt(9)+1)*1000); //增加不确定性,至少睡眠1秒
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- synchronized (token) {
- token.setFlag("wangmz"+Integer.toString(i));
- token.notifyAll();
- Log.v("Main",Integer.toString(i));
- }
- }
- }
- });
- }
- private class WorkThread extends Thread {
- @Override
- public void run() {
- Random r=new Random();
- while (true) {
- // try {
- // Thread.sleep((r.nextInt()+1)*1000);//可能在sleep的时候其他线程执行notify()。但此时对这个线程不起作用。所以结果不会按顺序出现
- // } catch (InterruptedException e1) {
- // e1.printStackTrace();
- // }
- synchronized (token) {
- try {
- token.wait();
- Log.v("Main", "the value is " + token.getFlag());
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- Log.v("work","while!!");
- }
- }
- }
- }
转:http://blog.csdn.net/mzwang123/article/details/7333885
转载于:https://www.cnblogs.com/jiezzy/archive/2012/08/27/2658881.html
android 线程 wait notify相关推荐
- Android 线程与线程安全
1.线程 线程是进程中可独立执行的最小单位,也是CPU资源分配的基本单位. 进程是程序向操作系统申请资源的基本条件,一个进程可以包含多个线程,同一个进程中的线程可以共享进程中的资源,如内存空间和文件句 ...
- Android线程之主线程向子线程发送消息
和大家一起探讨Android线程已经有些日子了,谈的最多的就是如何把子线程中的数据发送给主线程进行处理,进行UI界面的更新,为什么要这样,请查阅之前的随笔.本篇我们就来讨论一下关于主线程向子线程如何发 ...
- Android线程实例讲解
本文只是一个关于Android线程之间通信的例子,高手请自动略过.例子主要实现如下功能:进度条,音乐播放进度显示,图片的移动. 游戏部分源码: LoadBar.java package com.dan ...
- 有关Android线程的学习
1. Android进程 在了解Android线程之前得先了解一下Android的进程.当一个程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程.默认的情况下,所有该程序的组件都 ...
- (转)有关Android线程的学习
1. Android进程 在了解Android线程之前得先了解一下Android的进程.当一个程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程.默认的情况下,所有该程序的组件都 ...
- Android 线程池概念及使用
一:使用线程池的原因 在android开发中经常会使用多线程异步来处理相关任务,而如果用传统的newThread来创建一个子线程进行处理,会造成一些严重的问题: 在任务众多的情况下,系统要为每一个任务 ...
- Android线程管理(一)
线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...
- Android线程池封装库
目录介绍 1.遇到的问题和需求 1.1 遇到的问题有哪些 1.2 遇到的需求 1.3 多线程通过实现Runnable弊端 1.4 为什么要用线程池 2.封装库具有的功能 2.1 常用的功能 3.封装库 ...
- android线程控制UI更新(Handler 、post()、postDelayed()、postAtTime)
按照下面的理解就是handler与ui线程有一定的关联可以因为更新界面只能在主线程中所有更新界面的地方可以在接受消息的handleMessage那里还有更新界面可以在handler.port(new ...
最新文章
- Oracle数据库以及Oracle SQL Developer初体验
- Intent传递数据时,可以传递哪些类型数据
- python时域信号特征提取(各种因子)
- 解释logistic回归为什么要使用sigmoid函数
- Oracle 数据类型 选择自 tjandy 的 Blog
- 51NOD - 1381 1381 硬币游戏【思维+数学期望】
- python reportlab
- 道格拉斯简化_简化组织变革:困惑的指南
- sublime text里面中文字体显示异常解决方案
- Cesium和thingjs有哪些关系?
- 2020年最酷的十个无人机项目(下)
- [Unity3D] [学习] Unity3D的官方文档
- dreamweaver动漫HTML网站制作——海贼王主题网页1页海贼王我当定了(HTML+CSS)
- python instagram 爬虫
- Android8.0 修改默认铃声 添加新铃声
- FFmpeg源码分析:AVIOContext、IO模型与协议
- Schedule用法实例
- Matlab GUI编程技巧(十五):scroll滚动到组件内的位置及ScrollBar动画演示
- 如何给金蝶kis记账王录入美元初始数据
- 软件包后缀 noarch
热门文章
- 纽约大学Gary Marcus发文指出AlphaZero「被夸大」,强调重视人工智能「先天因素」
- 王劲首度解析景驰:我们是跑得最快的无人驾驶公司
- B 站 Up 主自制秃头生成器,独秃头不如众秃头?
- java线程同步以及对象锁和类锁解析(多线程synchronized关键字)
- 算法笔记-经典链表操作案例
- NHibernate 2.0 Beta 1 Released和一些工具
- codeforces 282E Sausage Maximization
- Bzoj3730 震波
- js array push 添加内容
- Python模块包中__init__.py文件的作用