博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java核心知识点学习----多线程并发之线程间的通信,notify,wait
阅读量:6339 次
发布时间:2019-06-22

本文共 1965 字,大约阅读时间需要 6 分钟。

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关键字来同步方法,使其在运行时不受影响.

 

 

 

转载地址:http://lnhoa.baihongyu.com/

你可能感兴趣的文章
CentOS yum安装mysql
查看>>
OceanBase笔记1:代码规范
查看>>
[Algorithms] Longest Increasing Subsequence
查看>>
MAC下GitHub命令操作
查看>>
springboot之filter/listener/servlet
查看>>
Thinkphp --- 去掉index.php
查看>>
Spring+SpringMVC+MyBatis深入学习及搭建(十一)——SpringMVC架构
查看>>
oracle故障解决
查看>>
tcpdump
查看>>
数据库内存结构
查看>>
利用Shell开发跳板机功能脚本案例
查看>>
51CTO的技术门诊谈OSSIM
查看>>
六年心路成长 —— 做自己
查看>>
ios电话拨打进行监听电话状态
查看>>
京东基于Spark的风控系统架构实践和技术细节
查看>>
什么时候使用CountDownLatch
查看>>
C#之MemberwiseClone与Clone
查看>>
Android性能优化之利用Rxlifecycle解决RxJava内存泄漏
查看>>
转: 如何为你的开源项目选择一个合适的开源协议?
查看>>
关系型数据库和NOSQL数据库对比
查看>>