zoukankan      html  css  js  c++  java
  • 线程4-线程通信

    1、线程间的通信主要靠三个方法
    (1)wait(),使当前线程放弃cpu、对象锁,重新排队等待对共享资源的访问
    (2)notify(),唤醒等待线程中优先级最高的线程,执行共享资源
    (3)notifyAll(),唤醒所有的等待线程
    (4)这三个方法是object里面的方法,而非thread方法,这些方法,只有在synchronized代码块或方法中才能使用
    否则会报,IlligalMonitorStateException,异常

    2、线程通信例子,要注意的事项在注释里面,实现两个线程轮流打印1到100的数据

    package com.thread.test;
    
    //实现两个线程轮流打印1到100的数据,synchronized所放位置有问题的例子
    class PrintNumber implements Runnable {
        int i = 0;
    
        @Override
        public void run() {
            synchronized (this) {// 有问题,如果这样,就会一个线程执行完while里面的代码后才出来
                notify();// 唤醒别的线程,因为当前线程已经拿到对象锁,所以可以唤醒其它线程
                while (i < 101) {
    
                    System.out.println("线程 " + Thread.currentThread().getName()
                            + " 打印出:" + i);
                    i++;
                }
                try {
                    wait();// 打印出一个数字后后等待
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    
    }
    
    // 下面锁的位置没有问题
    class PrintNumberNew implements Runnable {
        int i = 0;
    
        @Override
        public void run() {
    
            while (true) {
                synchronized (this) {// 有问题,如果这样,就会一个线程执行完while里面的代码后才出来
                    notify();// 唤醒别的线程,因为当前线程已经拿到对象锁,所以可以唤醒其它线程
                    if (i < 101) {
                        System.out.println("线程 " + Thread.currentThread().getName()
                                + " 打印出:" + i);
                        i++;
                    } else {
                        break;
                    }
                    try {
                        wait();// 打印出一个数字后后等待
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
    
            }
        }
    
    }
    
    /**
     * 线程间的通信主要靠三个方法 (1)wait(),使当前线程放弃cpu、对象锁,重新排队等待对共享资源的访问
     * (2)notify(),唤醒等待线程中优先级最高的线程,执行共享资源 (3)notifyAll(),唤醒所有的等待线程
     * (4)这三个方法是object里面的方法,而非thread方法,这些方法,只有在synchronized代码块或方法中才能使用
     * 否则会报,IlligalMonitorStateException,异常
     */
    
    public class 线程通信 {
        public static void main(String[] args) {
            PrintNumberNew pn = new PrintNumberNew();
    
            Thread t1 = new Thread(pn);
            Thread t2 = new Thread(pn);
    
            t1.setName("1");
            t2.setName("2");
            t1.start();
            t2.start();
        }
    }
  • 相关阅读:
    plsqldeveloper永久注册码
    git常用命令
    淘淘中的一些环境的处理
    Hibernate查询
    markdown的学习
    npm如何发布一个自己的package
    聊聊font-family的那些事
    js 随机生成任意长度的字符串
    CSS世界(张鑫旭)系列学习总结 (四)盒尺寸四大家族
    CSS世界(张鑫旭)系列学习总结 (三)width和height作用的具体细节
  • 原文地址:https://www.cnblogs.com/fubaizhaizhuren/p/5066542.html
Copyright © 2011-2022 走看看