zoukankan      html  css  js  c++  java
  • Java多线程--线程通信(一)

    等待/通知机制

    wait()方法

    1. wait()方法是Object类的方法,使当前正在执行的线程等待
    2. 调用wait方法前,线程必须获得对象的锁,必须在同步方法或同步块中调用wait方法
    3. 执行wait方法后,线程释放锁
    4. 如果调用wait时,线程没有持有锁则抛出IllegalMonitorStateException

    notify()方法

    1. notify()方法是Object类的方法,唤醒一个等待状态的线程
    2. 调用notify方法前,线程必须获得对象的锁,必须在同步方法或同步块中调用notify方法
    3. 执行notify方法后,线程不会马上释放锁,要等执行notify方法的线程退出synchronized块后才释放锁
    4. 如果调用notify时,线程没有持有锁则抛出IllegalMonitorStateException
    • notify()方法只能唤醒一个线程,如果notify方法调用的次数小于线程对象的数量,会出现部分线程无法唤醒的情况
    • 使用notifyAll()方法可以唤醒所有线程
    package ch03.test1;
    
    /*
    wait()方法和notfy()方法的使用
     */
     class MyThread1 extends Thread {
        private Object lock;
    
        public MyThread1(Object lock) {
            this.lock = lock;
        }
    
        @Override
        public void run() {
            super.run();
            synchronized (lock) {
                try {
                    System.out.println("开始wait time=" + System.currentTimeMillis());
                    lock.wait();
                    System.out.println("结束wait time=" + System.currentTimeMillis());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    class MyThread2 extends Thread {
        private Object lock;
    
        public MyThread2(Object lock) {
            this.lock = lock;
        }
    
        @Override
        public void run() {
            super.run();
            synchronized (lock) {
                System.out.println("开始notify time=" + System.currentTimeMillis());
                lock.notify();
                System.out.println("结束notify time=" + System.currentTimeMillis());
            }
        }
    }
    
    public class Test1 {
        public static void main(String[] args) throws InterruptedException {
            Object lock = new Object();
            MyThread1 myThread1 = new MyThread1(lock);
            myThread1.start();
            Thread.sleep(3000);
            MyThread2 myThread2 = new MyThread2(lock);
            myThread2.start();
        }
    }
    

    就绪和阻塞

    线程进入Runable状态的情况

    1. 调用start()方法
    2. 调用sleep()方法超过指定的时间
    3. 线程调用的阻塞IO完毕,阻塞方法返回
    4. 线程获得了试图同步的监视器
    5. 线程获得了正在等待的通知

    线程进入Blocked状态的情况

    1. 调用start()方法
    2. 调用阻塞IO方法
    3. 线程试图获得同步监视器,但是该监视器被其他线程占有
    4. 线程等待某个通知

    作者:lykxbg —— 来一块小饼干

    出处:http://www.cnblogs.com/lykxbg/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    js获取屏幕大小
    获取系统开机的时间(Windows、Linux)
    C++的STL中vector内存分配方法的简单探索
    服务器端如何判断客户端是不是手机
    测试简单for循环的效率
    多少钱都买不到这张表!百万都买不到这张表
    Unable to compile class for JSP
    windows上java中文乱码-指定字符集 -Dfile.encoding=UTF-8
    google翻译插件安装
    工作任务分配时的五个问题
  • 原文地址:https://www.cnblogs.com/lykxbg/p/13675747.html
Copyright © 2011-2022 走看看