`
naouguhtaeyeti
  • 浏览: 19944 次
文章分类
社区版块
存档分类
最新评论

java 线程 sleep 与 wait 的区别

阅读更多
java 线程 Thread 类的sleep 静态方法可以让当前线程睡眠(如果该线程持有某一对象的锁,sleep 时不会释放该锁。如果该线程没有拥有对象锁,则sleep 也不会锁定某一对象)。

而wait 方法也能够阻塞线程,让其睡眠一段时间或等待其它线程唤醒,不过,在调用wait 方法进入睡眠的时候,如果该线程拥有某一个对象锁,则在该线程进入睡眠时会释放该线程拥有的对象锁。


参考示例:
/**
 * 测试sleep 方法与 wait 方法的区别
 */
class Task implements Runnable{
	private int time = 0;
	public void run(){
		fun1();
	}
	
	public synchronized void fun1(){
		System.out.println(Thread.currentThread().getName()+ " start running time "+ time);	
	}
	
	public synchronized void fun2(){
		try{
				System.out.println(Thread.currentThread().getName()+ " start running time "+ time);
		//		Thread.sleep(3000);
				wait(3000);
				time += 3;
			  System.out.println(Thread.currentThread().getName()+ " end running time "+ time);
				}catch(Exception e){
					e.printStackTrace();
				}
	}
}

public class ThreadTest{
	public static void main(String[] args){
		Task task = new Task();
		Thread thread = new Thread(task);
		thread.start();
		task.fun2();
	}
}


运行结果:
main start running time 0
Thread-0 start running time 0
main end running time 3

改换成Thread.sleep
/**
 * 测试sleep 方法与 wait 方法的区别
 */
class Task implements Runnable{
	private int time = 0;
	public void run(){
		fun1();
	}
	
	public synchronized void fun1(){
		System.out.println(Thread.currentThread().getName()+ " start running time "+ time);	
	}
	
	public synchronized void fun2(){
		try{
				System.out.println(Thread.currentThread().getName()+ " start running time "+ time);
		//		Thread.sleep(3000);
				wait(3000);
				time += 3;
			  System.out.println(Thread.currentThread().getName()+ " end running time "+ time);
				}catch(Exception e){
					e.printStackTrace();
				}
	}
}

public class ThreadTest{
	public static void main(String[] args){
		Task task = new Task();
		Thread thread = new Thread(task);
		thread.start();
		task.fun2();
	}
}

运行结果:

main start running time 0
main end running time 3
Thread-0 start running time 3

但是如果把fun1 换成 静态方法,
/**
 * 测试sleep 方法与 wait 方法的区别
 */
class Task implements Runnable{
	private static int time = 0;
	public void run(){
		fun1();
	}
	
	public static synchronized void fun1(){
		System.out.println(Thread.currentThread().getName()+ " start running time "+ time);	
	}
	
	public synchronized void fun2(){
		try{
				System.out.println(Thread.currentThread().getName()+ " start running time "+ time);
				Thread.sleep(3000);
		//		wait(3000);
				time += 3;
			  System.out.println(Thread.currentThread().getName()+ " end running time "+ time);
				}catch(Exception e){
					e.printStackTrace();
				}
	}
}

public class ThreadTest{
	public static void main(String[] args){
		Task task = new Task();
		Thread thread = new Thread(task);
		thread.start();
		task.fun2();
	}
}



运行结果为:
main start running time 0
Thread-0 start running time 0
main end running time 3

这是因为当方法为静态时,线程锁定的是Task类对应的Class类的对象的锁,而Thread.sleep 锁定的是Task类的对象,是两个不同的对象锁,所以有以上结果。

分享到:
评论

相关推荐

    JAVA线程sleep()和wait()详解及实例

    主要介绍了JAVA线程sleep()和wait()详解及实例的相关资料,探讨一下sleep()和wait()方法的区别和实现机制,需要的朋友可以参考下

    Java线程中sleep和wait的区别详细介绍

    Java中的多线程是一种抢占式的机制,而不是分时机制。抢占式的机制是有多个线程处于可运行状态,但是只有一个线程在运行

    Java线程中wait,await,sleep,yield,join用法总结.pdf

    Java线程中wait、await、sleep、yield、join用法汇总,文章里面总结了这些关键字的用法,并且里面带有源码帮助分析用法,此一文就可以理解这些关键字用法,推荐拥有

    java sleep()和wait()

    sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行.wait()和它的区别请查看下载。

    java 多线程设计模式 进程详解

    《Java线程 高清晰中文第二版》中文第二版(PDF) 前言 第一章 线程简介 Java术语 线程概述 为什么要使用线程? 总结 第二章 Java线程API 通过Thread类创建线程 使用Runable接口的线程 线程的生命周期 线程命名 ...

    java线程分析java project例子

    java线程分析java project例子,里面分析了sleep(),join(),yield()和wait以及notify等方法的使用以及需要注意的地方。

    java线程学习笔记

    2.3 线程本地存储(Java.lang.ThreadLocal) 15 2.4 线程阻塞 17 2.4.1 调用sleep(millisecond)使任务进入休眠状态 17 2.4.2 等待输出与输入 17 2.4.3 对象锁不可用 17 2.4.4 通过wait()使线程挂起。 17 2.5 线程...

    java多线程示例

    Java中的多线程有三种实现方式: 1.继承Thread类,重写run方法。Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯一方法就是通过Thread...本示例演示和wait和sleep、线程锁的使用。

    计算机后端-Java-Java核心基础-第20章 多线程 16. sleep()和wait()的异同.avi

    计算机后端-Java-Java核心基础-第20章 多线程 16. sleep()和wait()的异同.avi

    线程学习小Test

    Java线程 wait notify sleep join 同步实现Demo

    java多线程设计模式

    java多线程设计模式 线程的创建和重起 线程的同步 wait/notify/sleep机制 Worker Pattern

    详解Java中的线程让步yield()与线程休眠sleep()方法

    Java中的线程让步会让线程让出优先级,而休眠则会让线程进入阻塞状态等待被唤醒,这里我们对比线程等待的wait()方法,来详解Java中的线程让步yield()与线程休眠sleep()方法

    Java 多线程

    详细解说了Java开发语言中多线程中sleep()与wait()的区别、联系。

    Java多线程教程吐血整理干货.md

    sleep方法和wait方法的区别 stop,suspend,resume等方法为什么会被遗弃 interrupt,interrupted,isInterrupted方法区别 join方法 yield方法 多线程 进程和线程 进程与线程最主要的区别是它们是操作系统管理资源的不同...

    Java线程中yield与join方法的区别

    之前,我讨论了一个wait()和sleep()方法区别的问题,这一次,我将会讨论join()和yield()方法的区别。坦白的说,实际上我并没有用过其中任何一个方法,所以,如果你感觉有不恰当的地方,请提出讨论。  Java线程调度...

    java用线程两种方式

    * wait释放资源,释放锁 * sleep释放资源,不释放锁 */ @SuppressWarnings("all") public class Thread1 { public static void main(String[] args) { //方法一 /* OddNumber js = new OddNumber(); js....

    java线程分析android project例子

    java线程分析android project例子,主要分析了sleep(),join(),yield()和wait()以及notify等方法以及需要注意的事项。

    java并发编程面试题

    sleep() 和 wait() 有什么区别? 什么是线程同步和线程互斥,有哪几种实现方式? Java 线程数过多会造成什么异常? 并发编程-Java内存模型 ## as-if-srial规则和happens-before规则的区别 synchronized、volatile、...

    Java多线程问题

    1)现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行? 2)在Java中Lock接口比synchronized块的优势是什么? 3)在java中wait和sleep方法的不同?

    Java中停止线程执行的方法

    尽管可以在等待wait()条件那里放一个超时设置,但等待wait()的设计目的不是这样的,等待wait()在设计上是用于Java线程间的通信。 而使用睡眠sleep()方式,可以让线程从当前开始睡眠指定的时间。注意不要使用睡眠...

Global site tag (gtag.js) - Google Analytics