`
hunter090730
  • 浏览: 194781 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

wait,notify,sleep,join和线程同步问题

    博客分类:
  • java
阅读更多

wait和notify 这两个方法都是Object中的原始方法

sleep和join这两个方法都是Thread中的原始方法

 

wait(),notify(),notifyAll()不属于Thread类,而是属于Object基础类也就是说每个对像都有wait(),notify(),notifyAll()
的功能.因为都个对像都有锁,锁是每个对像的基础,当然操作锁的方法也是最基础了.

 

调用Thread的sleep()方法时,并不释放锁。

sleep

public static void sleep(long millis,
                         int nanos)
                  throws InterruptedException
Causes the currently executing thread to sleep (cease execution) for the specified number of milliseconds plus the specified number of nanoseconds. The thread does not lose ownership of any monitors.

调用对像(java.lang.Object)wait方法后,当前线程释放对像锁,进入等待状态.直到其他线程(也只能是其他线程)通过notify 方法,或 notifyAll或者遇到InterruptedException.该线程重新获得对像锁.

 

线程同步:

可用方法同步或同步块两种方式来实现,JDK1。5的信号量其实也是用来实现线程同步的.

 

以下是参考<<Java多线程模式>>的
1. sleep() & interrupt()
    线程A正在使用sleep()暂停着: Thread.sleep(100000);
    如果要取消他的等待状态,可以在正在执行的线程里(比如这里是B)调用
        a.interrupt();
    令线程A放弃睡眠操作,这里a是线程A对应到的Thread实例
    执行interrupt()时,并不需要获取Thread实例的锁定.任何线程在任何时刻,都可以调用其他线程interrupt().当sleep中的线程被调用interrupt()时,就会放弃暂停的状态.并抛出InterruptedException.丢出异常的,是A线程.

2. wait() & interrupt()
    线程A调用了wait()进入了等待状态,也可以用interrupt()取消.
    不过这时候要小心锁定的问题.线程在进入等待区,会把锁定解除,当对等待中的线程调用interrupt()时(注意是等待的线程调用其自己的interrupt()),会先重新获取锁定,再抛出异常.在获取锁定之前,是无法抛出异常的.

3. join() & interrupt()
    当线程以join()等待其他线程结束时,一样可以使用interrupt()取消之.因为调用join()不需要获取锁定,故与sleep()时一样,会马上跳到catch块里. 注意是随调用interrupt()方法,一定是阻塞的线程来调用其自己的interrupt方法.如在线程a中调用来线程t.join().则a会等t执行完后在执行t.join后的代码,当在线程b中调用来a.interrupt()方法,则会抛出InterruptedException

4. interrupt()只是改变中断状态而已
    interrupt()不会中断一个正在运行的线程。这一方法实际上完成的是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态。更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。
    如果线程没有被阻塞,这时调用interrupt()将不起作用;否则,线程就将得到异常(该线程必须事先预备好处理此状况),接着逃离阻塞状态。
    线程A在执行sleep,wait,join时,线程B调用A的interrupt方法,的确这一个时候A会有InterruptedException异常抛出来.但这其实是在sleep,wait,join这些方法内部会不断检查中断状态的值,而自己抛出的InterruptedException。
    如果线程A正在执行一些指定的操作时如赋值,for,while,if,调用方法等,都不会去检查中断状态,所以线程A不会抛出InterruptedException,而会一直执行着自己的操作.当线程A终于执行到wait(),sleep(),join()时,才马上会抛出InterruptedException.
    若没有调用sleep(),wait(),join()这些方法,或是没有在线程里自己检查中断状态自己抛出InterruptedException的话,那InterruptedException是不会被抛出来的.

顺便加个与Thread.sleep()相同效果的代码:
public static void amethod(long x) throws InterruptedExcetion{
    if (x != 0) {
        Object o = new Object();
        synchronized (o) {
            o.wait(x);
        }
    }
}

 

分享到:
评论

相关推荐

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

    本文将总结五个关键的线程控制方法:wait()、await()、sleep()、yield()和join()。这些方法各自有独特的用途和不同的工作机制。 一、wait()、notify()、notifyAll()用法 wait()、notify()和notifyAll()是Object类...

    sleep()、wait()、yield()和join()方法特点及区别.docx

    3. **调用位置**:`wait()`, `notify()`和`notifyAll()`必须在同步环境中(同步方法或同步代码块)调用,而`sleep()`可以在任何地方调用。 4. **异常处理**:`sleep()`方法需要捕获`InterruptedException`,而`wait...

    线程中sleep、join、yield、wait的区别

    本文将详细解析线程中`sleep()`, `join()`, `yield()`, 和 `wait()` 四个方法的区别。 1. `sleep()` `sleep()` 方法是 `java.lang.Thread` 类的一个静态方法,它允许当前正在执行的线程在指定的毫秒数内暂停执行。...

    java线程同步及通信

    Java线程同步与通信是多线程编程中的关键概念,用于解决并发访问共享...理解并熟练掌握Java的线程同步和通信是编写高效、可靠的多线程程序的关键。通过实例代码,我们可以更好地理解这些概念,并在实际项目中灵活应用。

    Java线程同步例子.pdf

    通过上面的知识点,我们可以看到在Java编程中处理线程同步以及并发问题时需要注意的问题和解决方法。上述Java线程同步例子中涉及到的代码虽然是片段,但涵盖了线程同步处理的多个重要方面,帮助我们理解和使用Java...

    java线程线程安全同步线程

    线程可以通过`sleep()`、`wait()`、`join()`、`synchronized`等方法来控制其执行流程。 线程安全问题主要包括活锁和死锁。活锁是指两个或多个线程在执行过程中,因争夺资源而造成的一种互相等待的现象,但因为都...

    Java语言多线程编程讲义

    本文对Java语言的多线程编程进行了详细的讲解,涵盖了Java的线程机制、线程的创建、执行、结束、优先级、状态及状态间的转换、共享访问与线程同步、wait和notify在线程间的交互、Thread类的其他重要方法等方面的内容...

    线程学习小Test

    本教程将通过`wait()`, `notify()`, `sleep()` 和 `join()` 这四个关键方法的示例来探讨如何在Java中实现线程同步。 首先,`wait()`, `notify()` 和 `notifyAll()` 方法是Object类的一部分,它们用于线程间通信。当...

    简单的多线程同步实例

    为了解决这个问题,Java提供了多种同步机制,包括`synchronized`关键字、`wait()`、`notify()`和`notifyAll()`方法,以及`ReentrantLock`等高级锁。 在售票系统中,我们可能有一个共享的票数变量。如果多个线程同时...

    Java多线程详解(超详细)_狂神说笔记完整版_项目代码_适合小白随课程学习

    - `wait()`, `notify()`和`notifyAll()`方法用于线程间通信,需在同步环境中使用。 5. **线程通信问题** - 生产者-消费者问题:一个线程生产数据,另一个线程消费数据,需要避免生产者过度生产或消费者提前消费。...

    wait()编程wait()编程wait()编程wait()编程

    综上所述,`wait()`是Java多线程编程中的关键工具,正确使用它可以实现复杂的线程同步和协作策略。理解其工作原理和使用场景,有助于编写出高效、稳定的多线程程序。在实际应用中,应结合`notify()`和`notifyAll()`...

    多线程同步,互斥,联合,守护,计时器线程Timer

    线程同步是控制不同线程对共享资源访问的过程,以避免数据不一致和竞态条件。Java提供了多种同步机制,包括`synchronized`关键字、`wait()`, `notify()` 和 `notifyAll()` 方法,以及`Lock`接口(如`ReentrantLock`...

    Java多线程机制(讲述java里面与多线程有关的函数)

    线程同步是解决多线程环境下数据安全问题的关键。Java提供了synchronized关键字来实现方法或代码块的同步,防止多个线程同时访问同一块代码。 9.7 在同步方法中使用wait(), notify和notifyAll(): 这些方法用于线程...

    java+多线程+同步详解源代码学习

    - wait()、notify()和notifyAll():在同步块或同步方法中使用,用于线程间的通信。必须在持有对象锁的情况下调用,否则会抛出IllegalMonitorStateException。 - Condition接口:Lock接口的一个实现类提供,提供了...

    高薪程序员面试题精讲系列63之说说sleep()、yield()、join()、wait()的区别.pdf,这是一份不错的文件

    本资源主要讲解了Java中四个常用的线程控制方法:sleep()、yield()、join()和wait(),它们是Java多线程编程中的重要组成部分。下面是对每个方法的详细讲解: 1. sleep()方法: sleep()方法是Thread类...

    java多线程Demo

    3. 多线程同步与通信: 在多线程环境下,可能会出现数据竞争问题,为了解决这个问题,Java提供了多种同步机制,如synchronized关键字、wait/notify机制、Lock锁(ReentrantLock)等。synchronized用于控制对共享...

    Java的多线程-线程间的通信.doc

    - Java 5引入了Lock接口和Condition接口,作为synchronized关键字的替代品,提供了更灵活的线程同步和通信。Lock接口提供了lock(), unlock(), newCondition()等方法,Condition接口则提供了await(), signal()和...

    java多线程经典案例

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,极大地提升了程序的效率和性能。...在实际开发中,合理运用线程同步和通信机制,能够提高系统的响应速度和并发处理能力,提升软件的用户体验。

    线程,同步

    这个问题通常使用同步机制来解决,例如使用`wait()`和`notify()`方法来协调生产者和消费者之间的操作。 **示例代码**中展示了一个简单的生产者消费者模式,使用`synchronized`关键字来保证线程安全。生产者负责向...

    介绍 Java 多线程 的PPT

    `wait()`、`notify()`和`notifyAll()`是在线程同步中用于线程间通信的方法,允许一个线程等待另一个线程的通知来决定何时继续执行。 - **线程生命控制**:线程有三种基本状态:新建(New)、运行(Runnable)、阻塞...

Global site tag (gtag.js) - Google Analytics