博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程的互斥与同步通信 - 例子:子主线程打印,子主线程互补干扰问题
阅读量:5084 次
发布时间:2019-06-13

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

一. 互斥

  结局java线程中的互斥问题的的方法

   1.同步代码块,将敏感数据或者敏感操作放在同步代码块里,args代表一个参照,注意:多个方法调用同步代码块需要保证参照相同

synchronized (args) {  // Code                  }

    ※ args:可以是对象,可以是属性,也可以是类的字节码(类的字节码Object.class,jvm中唯一) 

    2.synchronized作为方法的修饰符

 

public synchronized void sync(int i){   System.out.println(" message "); }

二. 同步通信

  同步通信使用Object提供的三个方法wait ,notify和notfiyAll三个方法,简单的理解为线程之间的通信,一个线程通知另一个线程

 

三. JAVA一个经典习题

  子线程循环10次,紧接着主线程循环100次,紧接着子线程循环10次,主线程100次,如此往复50次

  

public class TraditionalThreadTest {        public static void main(String[] args) {    //主线程        final BusinessTest b = new BusinessTest();        new Thread(new Runnable() {    //子线程            @Override            public void run() {                for (int i = 1; i <= 50; i++) {                    b.sub(i);                }            }        }).start();                for (int i = 1; i <= 50; i++) {            b.main(i);        }            }}class BusinessTest{     private boolean flag = true;     public synchronized void sub(int i){         while (!flag) {    //true 執行            try {                this.wait();    //false是等待            } catch (InterruptedException e) {                e.printStackTrace();            }        }         for (int j = 1; j <= 10; j++) {            System.out.println("子线程 : "+ j + ",第"+ i +"次打印");        }         flag = false;         this.notify();    //通知下一个线程         System.out.println();     }     public synchronized void main(int i){         while (flag) {    //false 執行            try {                this.wait();    //true 等待            } catch (InterruptedException e) {                e.printStackTrace();            }        }         for (int j = 1; j <= 10; j++) {            System.out.println("主线程 : "+ j + ",第"+ i +"次打印");        }         flag = true;         this.notify();    //通知下一个线程         System.out.println();     }}

 实现原理:利用线程之间的通信获取flag的值,来确定是不是应该执行或者是应该停止

    注意这里的判断使用的是while而不是if,使用while的好处是可以自检

 

转载于:https://www.cnblogs.com/duwenlei/p/5088758.html

你可能感兴趣的文章
读构建之法第四章第十七章有感
查看>>
Windows Phone开发(4):框架和页 转:http://blog.csdn.net/tcjiaan/article/details/7263146
查看>>
Unity3D研究院之打开Activity与调用JAVA代码传递参数(十八)【转】
查看>>
python asyncio 异步实现mongodb数据转xls文件
查看>>
TestNG入门
查看>>
【ul开发攻略】HTML5/CSS3菜单代码 阴影+发光+圆角
查看>>
IOS-图片操作集合
查看>>
IO—》Properties类&序列化流与反序列化流
查看>>
测试计划
查看>>
Mysql与Oracle 的对比
查看>>
jquery实现限制textarea输入字数
查看>>
Codeforces 719B Anatoly and Cockroaches
查看>>
jenkins常用插件汇总
查看>>
c# 泛型+反射
查看>>
第九章 前后查找
查看>>
Python学习资料
查看>>
jQuery 自定义函数
查看>>
jquery datagrid 后台获取datatable处理成正确的json字符串
查看>>
ActiveMQ与spring整合
查看>>
web服务器
查看>>