登录  /  注册
首页 > Java > java教程 > 正文

Java多线程中线程间的通信

大家讲道理
发布: 2017-04-16 14:11:20
原创
1277人浏览过

一、使用while方式来实现线程之间的通信


package com.ietree.multithread.sync;import java.util.ArrayList;import java.util.List;public class MyList {    
    private volatile static List list = new ArrayList();    public void add() {
        list.add("apple");
    }    public int size() {        return list.size();
    }    public static void main(String[] args) {        final MyList list1 = new MyList();

        Thread t1 = new Thread(new Runnable() {
            @Override            public void run() {                try {                    for (int i = 0; i <p>程序输出:</p><p class="cnblogs_code"><br></p><pre class="brush:php;toolbar:false">当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
Exception in thread "t2" 当前线程收到通知:t2 list size = 5 线程停止..
java.lang.RuntimeException
    at com.ietree.multithread.sync.MyList$2.run(MyList.java:43)
    at java.lang.Thread.run(Unknown Source)
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
登录后复制

理解:线程Thread2不停地通过while语句检测这个条件(list.size()==5)是否成立 ,从而实现了线程间的通信。但是这种方式会浪费CPU资源。

二、wait notfiy 方法实现多线程中线程之间的通信

使用这种方式实现线程通信需要注意:wait和notify必须配合synchronized关键字使用,wait方法释放锁,notify方法不释放锁。并且在这个例子中必须是Thread2先执行才可以。


    List list =  "apple"    ListAdd2 list2 = 
         Object lock = =  Thread(  ( i = 0; i <p>程序输出:</p><p class="cnblogs_code"><br></p><pre class="brush:php;toolbar:false">当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
已经发出通知..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t2收到通知线程停止..
Exception in thread "t2" java.lang.RuntimeException
    at com.ietree.multithread.sync.ListAdd3$2.run(ListAdd3.java:59)
    at java.lang.Thread.run(Unknown Source)
登录后复制

三、使用CountDownLatch类来实现多线程中线程之间的实时通信


package com.ietree.multithread.sync;import java.util.ArrayList;import java.util.List;import java.util.concurrent.CountDownLatch;public class ListAdd2 {    private volatile static List list = new ArrayList();    public void add() {
        list.add("apple");
    }    public int size() {        return list.size();
    }    public static void main(String[] args) {        final ListAdd2 list2 = new ListAdd2();        final CountDownLatch countDownLatch = new CountDownLatch(1);

        Thread t1 = new Thread(new Runnable() {
            @Override            public void run() {                try {                    for (int i = 0; i <p>程序输出:</p><p class="cnblogs_code"><br></p><pre class="brush:php;toolbar:false">当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
已经发出通知..
Exception in thread "t2" 当前线程:t1添加了一个元素..
当前线程:t2收到通知线程停止..
java.lang.RuntimeException
    at com.ietree.multithread.sync.ListAdd2$2.run(ListAdd2.java:56)
    at java.lang.Thread.run(Unknown Source)
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
登录后复制

 

以上就是Java多线程中线程间的通信的详细内容,更多请关注php中文网其它相关文章!

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
最新问题
关于CSS思维导图的课件在哪? 课件
凡人来自于2024-04-16 10:10:18
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号