java之Thread.sleep(long)与object.wait()/object.wait(long)的区别(转)

一、Thread.sleep(long)与object.wait()/object.wait(long)的区别
sleep(long)与wait()/wait(long)行为上有些类似,主要区别如下:
1.Thread.sleep(long)是属于Thread类的静态方法。其基本语义是使当前运行的线程暂停一段时间。实现细节是把当前线程放入就绪线程队列中,直到睡眠时间到期才可被调度为执行线程(在时间到期前无法被调度为执行线程)。此方法可以在sychronized代码块中,调用此方法不释放对象锁;也可以不在sychronized代码块中。此方法的作用线程一定是当前运行的线程(如果代码在一个线程类中,不一定是代码所在的线程实例),即使是在线程对象上调用sleep(long)或调用Thread.currentThread().sleep(long)。

2.object.wait()是属于类实例(Object及其子类实列,也包括Class类实例)的方法。其基本语义是使当前线程等待,直到被通知,默认是this.wait()。实现细节是把当前线程放入阻塞线程队列中,并把当前线程注册为指定对象的监听器,并锁释放指定对象的锁;当被notify/notifyAll通知时,重新争取指定对象的锁,并把当前线程从指定对象的监听器中移除,把当前线程从阻塞队列放入就绪队列,等待被调度。此方法必须在sychronized代码块中,且锁定的对象要与等待通知来源的对象一致。而wait(long)方法阻塞时放入的是就绪队列,等待时间到期或被通知就可被调度,其他与wait()方法相同。

注:从上可基本认识到线程的执行、就绪、阻塞三种状态的切换,以及线程的调度(操作系统调度线程)和就绪线程队列、阻塞线程队列(实际实现可能更复杂,比如优先级,调度策略等)。可认识到object(包括Class类的实例)的wait/notify/notifyAll的对象监听和通知事件模式,以及对象上的锁、锁队列(实际实现可能更复杂,比如优先级,锁争用等)、阻塞线程监听队列(notify时只通知一个监听器,具体调度未知,另有自动唤醒,条件唤醒)。

http://blog.csdn.net/qingmingcom/article/details/6590967

时间: 2024-10-25 15:05:37

java之Thread.sleep(long)与object.wait()/object.wait(long)的区别(转)的相关文章

Java多线程编程模式实战指南:Active Object模式(下)

Active Object模式的评价与实现考量 Active Object模式通过将方法的调用与执行分离,实现了异步编程.有利于提高并发性,从而提高系统的吞吐率. Active Object模式还有个好处是它可以将任务(MethodRequest)的提交(调用异步方法)和任务的执行策略(Execution Policy)分离.任务的执行策略被封装在Scheduler的实现类之内,因此它对外是不“可见”的,一旦需要变动也不会影响其它代码,降低了系统的耦合性.任务的执行策略可以反映以下一些问题: 采

JAVA GUI THREAD

针对用户界面的多线程现在,我们也许能用一个线程解决在Counter1.java中出现的问题.采用的一个技巧便是在一个线程的run()方法中放置"子任务"--亦即位于go()内的循环.一旦用户按下Start按钮,线程就会启动,但马上结束线程的创建.这样一来,尽管线程仍在运行,但程序的主要工作却能得以继续(等候并响应用户界面的事件).下面是具体的代码: //: Counter2.java // A responsive user interface with threads import

java.lang.Thread.State类详解

public static enum Thread.Stateextends Enum<Thread.State>线程状态.线程可以处于下列状态之一: 1.NEW 至今尚未启动的线程的状态. 2.RUNNABLE 可运行线程的线程状态.处于可运行状态的某一线程正在 Java 虚拟机中运行,但它可能正在等待操作系统中的其他资源,比如处理器. 3.BLOCKED 受阻塞并且正在等待监视器锁的某一线程的线程状态.处于受阻塞状态的某一线程正在等待监视器锁,以便进入一个同步的块/方法,或者在调用 Obj

Java线程Thread及其常用方法

Java SE7 API - Thread: http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#yield%28%29 一.线程的简介 当JVM启动的时候, 通常会有一个独立的非守护线程(也就是类中的main方法所在的线程).JVM会继续运行,除非发生以下情况: Runtime类的exit()方法被调用,并且安全管理者允许退出发生. 所有非守护线程都已经死了,不管是从run方法中返回的还是因为run方法中抛出了异常. 注

【转】java中Thread类方法介绍

原文: java中Thread类方法介绍 http://blog.csdn.net/seapeak007/article/details/53395609 这篇文章找时间分析一下!!!:http://blog.csdn.net/apei830/article/details/4503112 --------------------------------------------------------------- 方法摘要 static int activeCount()          

java 线程 --- Thread,Runnable,Callable 基础学习

java 使用 Thread 类代表线程,所有现场对象都必须是 Thread 类或者其子类的实例.每个线程的作用是完成一定的任务,实际上就是执行一段程序流.java 使用线程执行体来代表这段程序流. 1.继承Thread 类创建线程 启动多线程的步骤如下: (1)定义Thread 类的子类,并重写该类的run() 方法,该run() 方法的方法体就代表类线程需要完成的任务.因此把run() 方法称为线程执行体. (2)创建 Thread 子类的实例,即创建线程对象. (3)调用线程的star()

生产环境遇到的hashMap非线程安全问题java.lang.thread.waiting

写在前面:工作有几年了,从入门到现在,遇到也解决了一些问题.(当然,框架级别的暂时还没有)一直以来,都是从博客园以及其他各大社区搜罗出来的各种fix方法.目前稍有闲暇时间,在看过大V沈剑的博文后,我也鼓起勇气来书写博客,记录工作中遇到和解决的问题(其中当然也包括我在博园获取的各种解决方法:能找到原博文的小弟一定会注明出处.)因为总觉得自己水平不够,怕写出来的文章误导了别人.以下是这周生产环境遇到的一个问题,写出来供大家参考. 现象 周五一大早,车子都没停稳(电动车),群里就开始在询问谁最近的代码

java用Thread方式创建多线程

进程:一个正在执行的程序,每一个进程都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元.线程:进程中一个独立的控制单元.线程控制着进程的执行.一个进程中至少有一个线程. java VM中至少有一个线程负责java程序的执行.而且这个线程运行的代码存在于main方法中.该线程为主线程. 扩展,jvm启动了两个线程,一个主线程,一个垃圾回收机制的线程. 1.怎样创建一个多线程?第一种方法:通过继承Thread类的方法 1.继承Thread类 2.重写Thread类的run()方法 目的:将自

【Java编码准则】の #11不要使用Object.equals()来比较密钥值

java.lang.Object.equals()函数默认情况下是不能用来比较组合对象的,例如密钥值.很多Key类没有覆写equals()函数,因此,组合对象的比较必须单独比较里面的各个类型以保证正确性. [不符合安全要求的代码示例] 下面的代码使用equals()函数比较两个key值,key值即使具有相同的取值也可能会返回不相等,导致结果出错. private static boolean keysEqual(Key key1, Key key2) { if (key1.equals(key2