java多线程:5 线程间通讯 --新公司入职,有点忙未完成

来源:互联网 发布:ip地址数据库 编辑:程序博客网 时间:2024/04/28 14:42

线程间的通讯:同一进程中不同线程之间的通讯。

通讯方式

线程之间的通讯方式主要有:1 共享变量;2 wait、notify()/notifyAll(),3 condition,lock,4 管道机制。

  共享变量

共享变量:就是多个线程通过同一个变量,进行通信,你在这儿放个信息,我到时候去取,这样就完成了一次通信,当然这是简单的通讯。

package com.thread.communication;import java.util.Random;/**通过共享变量进行通讯,当已经完成的线程超过10个后,就启动特殊的线程。    或者指定的service执行完成,再执行特殊的线程。***/package com.thread.communication;import java.util.Random;/**通过共享变量进行通讯,注意这里的限制条件是:只要有5个线程完成了,特殊线程就可以执行了***/public class ShareVariable {    public static void main(String[] args) {        final Signal signal = new Signal(5);        for(int i=0;i<20;i++){            new Thread(new Runnable() {                public void run() {                    int i = new Random().nextInt(10000)+100;                    while((i--)>0);                    signal.complete();                }            }).start();        }        //特殊线程        new Thread(new Runnable() {            public void run() {                //循环判断已经执行的线程数是否满足                while(!signal.isComplete());                System.out.println(Thread.currentThread().getName()+" 终于可以干活了");            }        }).start();        System.out.println("---------");    }}class Signal{    private int totalNum;//需要完成线程的数量    private int completeNum;//已经完成的线程数量    public Signal(int totalNum){        this.totalNum = totalNum;    }    public synchronized void complete(){        System.out.println(Thread.currentThread().getName()+" 完成工作 "+totalNum+","+completeNum);        if(totalNum > completeNum){            completeNum++;        }    }    public synchronized boolean isComplete(){        System.out.println(Thread.currentThread().getName()+"----");        return (totalNum == completeNum);    }}输出:Thread-0 完成工作 5,0Thread-1 完成工作 5,1Thread-5 完成工作 5,2Thread-9 完成工作 5,3Thread-2 完成工作 5,4Thread-6 完成工作 5,5Thread-10----Thread-10 终于可以干活了Thread-4 完成工作 5,5Thread-8 完成工作 5,5Thread-3 完成工作 5,5Thread-7 完成工作 5,5从输出内容看:会发现特殊线程是第7个执行的,因为我们的条件是,只要有5个线程完成,特殊线程就可以执行了,注意这里是执行,并没有说特殊线程立刻执行,因为特殊线程还需要和其他线程进行锁的争夺,这次的输出应该是没有争取到。多执行几次,估计可以看到如下的输出:Thread-1 完成工作 5,0Thread-5 完成工作 5,1Thread-2 完成工作 5,2Thread-4 完成工作 5,3Thread-10----Thread-10----Thread-8 完成工作 5,4Thread-0 完成工作 5,5Thread-10----Thread-10 终于可以干活了Thread-6 完成工作 5,5Thread-9 完成工作 5,5Thread-3 完成工作 5,5会发现特殊线程执行了多次,但是只有当5个线程完成后,才会有机会执行特殊线程。如果要求特殊线程必须第6个执行,那么就需要严格的处理代码逻辑,1 totalNum和completeNum都需要volatile进行修改,同时普通线程执行的时候,如果是第6个执行的线程,就需要等待,让特殊线程优先执行。

wait、notify()/notifyAll()
    通过系统提供的wait和notify机制进行线程之间的通信,主要是线程执行顺序的通讯,例如:当不符合条件的线程获取锁之后,就wait,直到其他线程唤醒,继续进行执行顺序的判断。

这里写代码片
原创粉丝点击