java基础知识回顾之java Thread类学习(九)--wait和notify区别
wait和sleep区别:
- 相同点:调用wait,sleep方法都可以是线程进入阻塞状态,让出cpu的执行权。
- 不同点:1.sleep必须指定时间,但是wait方法可以指定时间,也可以不指定时间。
2.wait方法必须在同步中使用,但是sleep不一定在同步中使用。
3.在同步中,调用sleep方法释放CPU执行权,但是不会释放锁,即使让出了CPU执行权,其它线程也无法进入同步锁,不能得到执行。但是wait 方法不仅释放CPU执行权,而且释放同步锁,进入阻塞状态。也就是说其它等待此锁的线程可以得到同步锁并运行,阻塞的线程要想再次获得 CPU资格执行必须让其他线程调用notify方法唤醒。
package com.lp.ecjtu.Thread;
public class WaitOrSleep {
private static class Thread1 implements Runnable{
@Override
public void run() {
//由于这里的Thread1和下面的Thread2内部的run方法要用同一个对象作为锁(监视器)
//这里不能用this,因为Thread2里面的this和Thread1里面的this不是同一个对象
//用WaitOrSleep.class这个字节码对象,因为引用的是同一个对象
synchronized(WaitOrSleep.class){
System.out.println("进入线程1----------");
System.out.println("线程1----------wait");
try {
WaitOrSleep.class.wait();//释放锁
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("线程1正在运行。。。。。。。。。");
System.out.println("线程1结束");
}
}
}
private static class Thread2 implements Runnable{
@Override
public void run() {
synchronized(WaitOrSleep.class){
System.out.println("进入线程2----------");
System.out.println("线程2唤醒其它线程。。。。。。");
WaitOrSleep.class.notify();//线程2唤醒其其它线程
//由于notify并不释放锁,让线程2睡10毫秒,因为Sleep方法也不会释放锁,所以线程1不会执行
//等到线程2执行完了,才释放锁,线程1才执行
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程2正在运行。。。。。。。。。");
System.out.println("线程2结束");
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
new Thread(new Thread1()).start();
new Thread(new Thread2()).start();
}
}
输出结果:
进入线程1----------
线程1----------wait
进入线程2----------
线程2唤醒其它线程。。。。。。
线程2正在运行。。。。。。。。。
线程2结束
线程1正在运行。。。。。。。。。
线程1结束
大家通过本来应该完全明白了其区别。。。。。。。
java基础知识回顾之java Thread类学习(九)--wait和notify区别的更多相关文章
- java基础知识回顾之---java String final类普通方法
辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /* * 按照面向对象的思想对字符串进行功能分类. * ...
- java基础知识回顾之java Thread类学习(三)--java线程实现常见的两种方式实现好处:
总结:实现Runnable接口比继承Thread类更有优势: 1.因为java只能单继承,实现Runnable接口可以避免单继承的局限性 2.继承Thread类,多个线程不能处理或者共享同一个资源,但 ...
- java基础知识回顾之java Thread类--java线程实现常见的两种方式实现Runnable接口(二)
创建线程的第二中方式: /** * 步骤: 1定义类实现Runnable接口 2.实现Runnable接口中的run方法. 3.通过Thread类建立线程对象,并将Run ...
- java基础知识回顾之java集合类-Properties集合
/** java.lang.Object |--java.util.Dictionary<K,V> |--java.util.Hashtable<Object,Obje ...
- java基础知识回顾之java Thread类学习(八)--java.util.concurrent.locks(JDK1.5)与synchronized异同讲解
看API文档介绍几个方法: JDK1.5中提供了多线程的升级解决方案: 特点: 1.将同步synchronized显示的替换成Lock 2.接口Conditio ...
- java基础知识回顾之java Thread类学习(八)--java多线程通信等待唤醒机制经典应用(生产者消费者)
*java多线程--等待唤醒机制:经典的体现"生产者和消费者模型 *对于此模型,应该明确以下几点: *1.生产者仅仅在仓库未满的时候生产,仓库满了则停止生产. *2.消费者仅仅在有产品的时 ...
- java基础知识回顾之java Thread类学习(十)--线程的状态以及转化使用的方法介绍
线程的概述: 线程是程序的多个执行路径,执行调度的单位,依托于进程存在.线程不仅可以共享进程的内存,而且还拥有一个属于自己的内存空间,这段内存空间叫做线程栈,是建立线程的时候由系 ...
- java基础知识回顾之java Thread类学习(四)--java多线程安全问题(锁)
上一节售票系统中我们发现,打印出了错票,0,-1,出现了多线程安全问题.我们分析为什么会发生多线程安全问题? 看下面线程的主要代码: @Override public void run() { // ...
- java基础知识回顾之java Thread类学习(七)--java多线程通信等待唤醒机制(wait和notify,notifyAll)
1.wait和notify,notifyAll: wait和notify,notifyAll是Object类方法,因为等待和唤醒必须是同一个锁,不可以对不同锁中的线程进行唤醒,而锁可以是任意对象,所以 ...
- java基础知识回顾之java Thread类学习(六)--java多线程同步函数用的锁
1.验证同步函数使用的锁----普通方法使用的锁 思路:创建两个线程,同时操作同一个资源,还是用卖票的例子来验证.创建好两个线程t1,t2,t1线程走同步代码块操作tickets,t2,线程走同步函数 ...
随机推荐
- UVA 1646 Edge Case
题意:n(3<=n<=10000)个结点组成一个圈,点顺次连接为边,求没有公共点的边集个数. 分析: 1.推规律,n=3有4个,n=4有7个,n=5有11个,n=6有18个,--,a[i] ...
- laravel框架少见方法详解
1.whereDate() 方法 $q->where('created_at', '>=', date('Y-m-d').' 00:00:00')); 以前查数据时,直接用where条件来 ...
- 用PHP判断客户端是否是手机
<?php function isMobile(){ $useragent = isset($_SERVER['HTTP_USER_AGENT'])? $_SERVER['HTTP_USER_A ...
- Color About——Second
下面来简要的说一下Android开发中如何对某一个Activity进行背景色的设置.下面我以名字为FirstActivity的Activity的背景色的设置进行说明,先说一下Drawable类: 关于 ...
- How to force to Fullscreen Form
Is it possibile by code resize a form to fullscreen? (like button Maximize) ? // VAR Changed on 10 J ...
- Python开发【第一篇】Python基础之装饰器
写代码要遵循开发封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即: 封闭:已实现的功能代码块开放:对扩展开发 #s2 ...
- python学习第三天第一部分
字典 1.字典的定义和规则: 定义:{key1:value1,key2:value2} key 的定义规则:1.必须是不可变的(数字.字符串.元组):2.必须是唯一的, value的定义规则:任意类型 ...
- PySide 简易教程<二>-------工欲善其事,必先利其器
OK , 在Linux的开发环境下,对于我们的简短的PySide程序而言,不需要使用QtCreator,使用文本编辑器.之所以,使用文本编辑器,是因为小应用代码量很少,更重要的是一行行的写可以加深我们 ...
- java之classpath到底是什么
如果你输入一个命令,比如java那么系统是如何找到这个命令的呢?按照顺序,系统先在当前目录搜索是否有java.exe, java.bat 等. 如果没有,就得到系统的PATH(不区分大小写)里面查找. ...
- TQ2440开发板网络配置方式
一.命令行模式 1.设置IP.子网掩码(netmask) #ifconfig eth0 <IP地址> netmask <子网掩码> up up 表示开启网卡eth0,可以不加 ...