欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

线程:等待/通知机制

发布时间:2025/6/15 编程问答 39 豆豆
生活随笔 收集整理的这篇文章主要介绍了 线程:等待/通知机制 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

  方法wait()

   方法wait()的作用是使当前执行代码的线程进行等待, wait()被执行后,锁被自动释放。wait()方法是Object类的方法,该方法用来将当前线程置入"预执行队列"中,并且在wait()所在的代码处停止执行,直到接到通知或被中断为止。

   方法notify()

   在执行完notify()方法后,当前线程不会马上释放该对象锁,呈wait状态的线程也并不能马上获取该对象锁,要等到执行notify()方法的线程将程序执行完,也就是退出synchronized代码块后,当前线程才会释放锁,而呈wait状态所在的线程才可以获取该对象锁。

   notify()方法一次只随机通知一个线程进行唤醒。

   notifyAll()方法唤醒所有线程。

wait(long)方法

   带一个参数的wait(long)方法的功能是等待某一时间是否有线程对锁进行唤醒,如果超过这个时间则自动唤醒。

public class Run {static private Object lock = new Object();static private Runnable runable1 = new Runnable(){@Overridepublic void run() {synchronized(lock){try {System.out.println("wait begin timer" + System.currentTimeMillis());lock.wait(5000);System.out.println("wait end timer" + System.currentTimeMillis());} catch (InterruptedException e) {e.printStackTrace();}}}};public static void main(String[] args){Thread t = new Thread(runable1);t.start();} }

  

 

当interrupt方法遇到wait方法

  当线程呈wait状态时, 调用线程对象的interrupt()方法会出现InterruptedException异常.

public class Service {public void testMethod(Object lock){try{synchronized(lock){System.out.println("begin wait...");lock.wait();//Thread.sleep(10000);System.out.println(" end wait...");}}catch(InterruptedException e){e.printStackTrace();System.out.println("出现异常了,因为呈wait状态的线程被interrupt了 !");}} }public class ThreadA extends Thread{private Object lock;public ThreadA(Object lock){this.lock = lock;}@Overridepublic void run(){Service service = new Service();service.testMethod(lock);} }public class Test {public static void main(String[] args){try{Object lock = new Object();ThreadA a = new ThreadA(lock);a.start();Thread.sleep(5000);a.interrupt();}catch(InterruptedException e){e.printStackTrace();}} }

通过管道进行线程间通信: 字节流,字符流

  在jdk中, 提供了4个类来使线程间可以进行通信: 

   1). PipedInputStream 和 PipedOutputStream  处理字节流

   2). PipedReader和PipedWriter  处理字符流

总结

以上是生活随笔为你收集整理的线程:等待/通知机制的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。