• 技术文章 >Java >java教程

    Java多线程中线程间的通信

    大家讲道理大家讲道理2017-04-16 14:11:20原创642

    一、使用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 < 10; i++) {
                            list1.add();
                            System.out.println("当前线程:" + Thread.currentThread().getName() + "添加了一个元素..");
                            Thread.sleep(500);
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }, "t1");
    
            Thread t2 = new Thread(new Runnable() {
                @Override            public void run() {                while (true) {                    if (list1.size() == 5) {
                            System.out.println("当前线程收到通知:" + Thread.currentThread().getName() + " list size = 5 线程停止..");                        throw new RuntimeException();
                        }
                    }
                }
            }, "t2");
    
            t1.start();
            t2.start();
        }
    }


    程序输出:


    当前线程: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 < 10; i++"当前线程:" + Thread.currentThread().getName() + "添加了一个元素.."500 (list2.size() == 5"已经发出通知..""t1"=  Thread(  (list2.size() != 5"当前线程:" + Thread.currentThread().getName() + "收到通知线程停止.." "t2"


    程序输出:


    当前线程: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 < 10; i++) {
                            list2.add();
                            System.out.println("当前线程:" + Thread.currentThread().getName() + "添加了一个元素..");
                            Thread.sleep(500);                        if (list2.size() == 5) {
                                System.out.println("已经发出通知..");
                                countDownLatch.countDown();
                            }
                        }                    // }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
    
                }
            }, "t1");
    
            Thread t2 = new Thread(new Runnable() {
                @Override            public void run() {                if (list2.size() != 5) {                    try {
                            countDownLatch.await();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println("当前线程:" + Thread.currentThread().getName() + "收到通知线程停止..");                throw new RuntimeException();
                }
            }, "t2");
    
            t2.start();
            t1.start();
    
        }
    }


    程序输出:


    当前线程: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中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:Java,多线程
    上一篇:Java抽象类定义以及抽象方法的实例代码分享 下一篇:详解java处理按钮点击事件的方法
    Web大前端开发直播班

    相关文章推荐

    • Java经典技巧之实现多线程、线程同步• Java归纳总结之数组详解• 详细整理java枚举的使用总结• 一起聊聊Java常用数据类型的输入输出• 详细解析Java反射机制原理和几种Class获取方式

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网