zoukankan      html  css  js  c++  java
  • Java核心知识点学习----多线程并发之线程间的通信,notify,wait

    1.需求:

    子线程循环10次,主线程循环100次,这样间隔循环50次.

    2.实现:

    package com.amos.concurrent;
    
    /**
     * @ClassName: ThreadSynchronizedConnect
     * @Description: 用wait,notify实现线程间的通信,需求:子线程循环10次,主线程循环100次,这样间隔循环50次.
     * @author: amosli
     * @email:hi_amos@outlook.com
     * @date Apr 20, 2014 4:39:44 PM
     */
    public class ThreadSynchronizedConnect {
    
        public static void main(String[] args) {
            final Business business = new Business();
            new Thread(new Runnable() {
                public void run() {
                    for (int i = 0; i < 50; i++) {
                        business.sub(i);
                    }
                }
            }).start();
    
            for (int i = 0; i < 50; i++) {
                business.main(i);
            }
        }
    
        /*
         * 经验:要用到共同数据(包括同步锁)的若干方法,应该归在同一个类身上,这样方便实现,高类聚和程序的健状性上.
         */
        static class Business {
            private boolean is_sub = true;
            //子方法
            public synchronized void sub(int i) {
                while (!is_sub) {//如果不为true,将等待,Blocked状态
                    try {
                        this.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                for (int j = 0; j < 10; j++) {
                    System.out.println("sub thread:" + j + "  loop:" + i);
                }
                is_sub=false;
                this.notify();//唤醒正在等待的线程
            }
            //主方法
            public synchronized void main(int i) {
                while (is_sub) {
                    try {
                        this.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                for (int j = 0; j < 100; j++) {
                    System.out.println("main thread:" + j + "  loop:" + i);
                }
                is_sub=true;
                this.notify();
            }
        }
    
    }

    3.注解:

    这里要注意的是如果要用到共同数据(包括同步锁)的若干方法,应该归在同一个类身上.

    1).从线程的四种状态之间的转换图可能看到,将一个线程从可运行状态转为阻塞状态只需要调用wait()方法,即将线程加入到等待状态.

    2).然后将等待中的状态唤醒只需要调用notify()方法即可,如果要唤醒所有等待中的线程,可以调用notifyall()方法.

    3)使用synchronized关键字来同步方法,使其在运行时不受影响.

  • 相关阅读:
    vue : 无法加载文件 C:Users1AppDataRoaming pmvue.ps1,因为在此系统上禁止运行脚本
    Flutter 常用的第三方库
    Dart 中的类
    Flutter 学习
    在 VSCode 中开发Flutter项目
    Flutter 环境配置的一些坑
    前端资源和优秀项目地址
    一小时学习JQuery材料
    基于RCT6的YX6100语音模块方案
    Java中反射和内省代码实例
  • 原文地址:https://www.cnblogs.com/amosli/p/3676737.html
Copyright © 2011-2022 走看看