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

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()`方法都是在多线程环境中用于控制线程执行的重要工具,但它们之间存在着显著的区别。理解这些差异对于编写高效、正确的并发代码至关重要。 首先,Java的多线程机制基于抢占式模型,...

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

    本篇文章将详细介绍JAVA线程sleep()和wait()的原理、区别和实现机制,并提供实例代码以便更好地理解这两个方法。 一、sleep()方法 sleep()方法是Thread类的一个静态方法,使得Runnable实现的线程也可以使用sleep...

    多线程sleep,yield,wait区别

    `sleep`, `yield`, 和 `wait` 是 Java 中用于线程管理的三个重要方法,它们各自有着不同的功能和用途。理解它们的区别有助于编写出更加高效和可控的多线程程序。 1. **sleep() 方法** - `Thread.sleep(millisecond...

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

    以上就是对Java线程中wait、await、sleep、yield、join用法的总结。这些方法在实际开发中,对于控制多线程运行的时序和协调非常关键。理解这些方法的正确使用方式是掌握Java并发编程的基础。同时,使用时需特别注意...

    java sleep()和wait()

    ### Java中的sleep()与wait()方法详解 #### 一、Java sleep()方法解析 ##### 1.1 方法定义与用途 `sleep()`方法是Thread类中的一个静态方法,用于让当前正在执行的线程暂停执行指定的时间(毫秒),之后线程将重新...

    Java线程状态流转图

    Java线程状态流转图中,以下方法与线程状态转换相关: * Object.wait():使线程从RUNNABLE状态转换到WAITING状态。 * Object.notify():使线程从WAITING状态转换到RUNNABLE状态。 * Object.notifyAll():使多个线程...

    java线程与并发编程实践

    在《java线程与并发实践编程》中,作者Jeff Friesen可能还会深入讨论线程池的配置策略、死锁和活锁的预防、线程性能分析与调优,以及Java内存模型(JMM)和线程通信模型(如wait()、notify()、notifyAll())等内容。...

    java多线程Demo

    Java线程有10个优先级(MIN_PRIORITY, NORM_PRIORITY, MAX_PRIORITY),默认优先级是NORM_PRIORITY。但是,线程优先级并不保证绝对的执行顺序,操作系统调度策略可能影响实际执行顺序。 7. join()方法: 一个线程...

    Java线程详解大全

    Java线程是并发编程的核心部分,它允许程序在同一时间执行多个独立的任务,从而提高系统效率和响应速度。本文将深入探讨Java线程的概念、生命周期、实现方式以及相关的同步机制。 首先,理解线程的基本概念至关重要...

    sleep() 方法和wait()方法的区别.docx

    sleep() 方法和 wait() 方法都是 Java 中的线程控制方法,但是它们有着本质的区别。下面是对这两种方法的详细比较和分析。 sleep() 方法 sleep() 方法是 Thread 类的静态方法,它的主要作用是使当前线程进入停滞...

    Java线程.ppt

    线程与进程的主要区别在于,进程拥有独立的内存空间和系统资源,而线程则是轻量级的进程,它们共享同一块内存空间和系统资源,因此线程间的切换成本较低。多线程可以提高程序的并发性,尤其在有多处理器的系统中,每...

    java线程实例 各种小Demo

    Java线程是多任务编程的重要概念,它允许程序同时执行多个独立的任务,从而提高系统效率和响应速度。在Java中,线程可以分为用户线程和守护线程,前者是程序运行的基础,而后者是在所有用户线程结束时才终止的后台...

    java中yieldsleep以及wait的区别.pdf

    Java中的多线程编程涉及到许多关键概念,包括`yield()`, `sleep()`, 和 `wait()`,这些都是控制线程执行的重要方法。理解它们的区别对于编写高效并发程序至关重要。 首先,`yield()`方法的作用是让当前正在执行的...

    java线程深入解析

    Java线程是Java编程语言中的核心概念,尤其在多任务处理和并发编程中扮演着重要角色。线程允许一个程序内部同时执行多个独立的控制流,使得程序能够更高效地利用处理器资源。本文将深入解析Java线程的相关知识点,...

    java sleep和wait的解惑.docx

    ### Java中的sleep与wait详解 #### 一、概述 在Java多线程编程中,`Thread.sleep()` 和 `Object.wait()` 是两个非常重要的方法,它们分别位于 `Thread` 类和 `Object` 类中,用于控制线程的行为。本文将深入探讨这...

    JAVA线程学习(源代码)

    本资源"JAVA线程学习(源代码)"提供了关于Java线程的源代码示例,帮助我们深入理解和实践线程的使用。 首先,我们要理解Java中的线程模型。Java线程由`java.lang.Thread`类或`java.util.concurrent.Executor`框架来...

    java线程.rar

    Java线程是Java编程语言中的一个核心概念,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,线程是通过类`Thread`或实现`Runnable`接口来创建和管理的。Java线程模型是基于操作系统的原生...

    java线程文档大全

    Java线程是多任务编程中的核心概念,它允许程序同时执行多个不同的任务,极大地提高了程序的效率和响应性。在Java中,线程是通过Java.lang.Thread类或实现Runnable接口来创建和管理的。这份“java线程文档大全”包含...

    java线程入门级书籍

    ### Java线程入门知识点详解 #### 一、Java线程基础知识概述 **1.1 什么是线程?** 线程是程序执行流的最小单元,是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。在Java中...

    Java线程培训资料

    ### Java线程培训资料知识点详解 #### 一、Java线程基本概念 1. **如何编写与启动线程** - **方式一:继承Thread类** ```java class MyThread extends Thread { @Override public void run() { // 业务逻辑 ...

Global site tag (gtag.js) - Google Analytics