java多线程实例,java线程之间如何通信?

KLQ 2020-06-17 16:10:18 java常见问答 6824

下面给大家带来的实例是和java多线程通信有关的内容,那么你知道java多线程之间的通信应该如何实现吗?一起来看看代码实例吧!

一、共享变量

线程间通信能够通过发送信号,发送信号的一个比较简单方式,就是在共享对象的变量里设置信号值。

线程A在一个同步块里设置boolean型成员变量hasDataToProcess为true,线程B也在同步块里读取hasDataToProcess这个成员变量。

这里使用了一个持有信号的对象,并且,还提供了set和get方法。

package igeekhome.com;
public class MySignal
{
    //共享的变量 
    private boolean hasDataToProcess = false;
    //取值 
    public boolean getHasDataToProcess()
    {
        return hasDataToProcess;
    }
    //存值 
    public void setHasDataToProcess(boolean hasDataToProcess)
    {
        this.hasDataToProcess = hasDataToProcess;
    }
    public static void main(String[] args)
    {
        //同一个对象 
        final MySignal my = new MySignal();
        //线程 1 设置 hasDataToProcess 值为 true 
        final Thread t1 = new Thread(new Runnable()
        {
            public void run()
            {
                my.setHasDataToProcess(true);
            }
        });
        t1.start();
        //线程 2 取这个值 hasDataToProcess 
        Thread t2 = new Thread(new Runnable()
        {
            public void run()
            {
                try
                {
                    //等待线程 1 完成然后取值 
                    t1.join();
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
                my.getHasDataToProcess();
                System.out.println("t1 改变以后的值:" + my.isHasDataToProcess());
                34.
            }
        });
        t2.start();
    }
}
结果:
t1 改变以后的值: true

二、wait/notify机制

以资源作为例子。

生产者生产除一个资源,通知消费者就消费掉一个资源,生产者继续生产资源,消费者消费资源,一直这样循环下去。

package igeekhome.com;
//资源类
class Resource
{
    private String name;
    private int count = 1;
    private boolean flag = false;
    public synchronized void set(String name)
    {
        //生产资源
        while (flag)
        {
            try
            {
                //线程等待。消费者消费资源
                wait();
            }
            catch (Exception e)
            {}
        }
        this.name = name + "---" + count++;
        System.out.println(Thread.currentThread()
            .getName() + "...生产者..." + this.name);
        flag = true;
        //唤醒等待中的消费者
        this.notifyAll();
    }
    public synchronized void out()
    {
        //消费资源
        while (!flag)
        {
            //线程等待,生产者生产资源
            try
            {
                wait();
            }
            catch (Exception e)
            {}
        }
        System.out.println(Thread.currentThread()
            .getName() + "...消费者..." + this.name);
        flag = false;
        //唤醒生产者,生产资源
        this.notifyAll();
    }
}
//生产者
class Producer implements Runnable
{
    private Resource res;
    Producer(Resource res)
    {
        this.res = res;
    }
    //生产者生产资源
    public void run()
    {
        while (true)
        {
            res.set("商品");
        }
    }
}
//消费者消费资源
class Consumer implements Runnable
{
    private Resource res;
    Consumer(Resource res)
    {
        this.res = res;
    }
    public void run()
    {
        while (true)
        {
            res.out();
        }
    }
}
public class ProducerConsumerDemo
{
    public static void main(String[] args)
    {
        Resource r = new Resource();
        Producer pro = new Producer(r);
        Consumer con = new Consumer(r);
        Thread t1 = new Thread(pro);
        Thread t2 = new Thread(con);
        t1.start();
        t2.start();
    }
}

java线程之间如何通信你都知道了吧?更多java入门内容,可以继续关注本站来了解哦。

推荐阅读:

线程的通信方式有哪些?线程通信方式实现

java多线程详解,进程和线程的区别是什么?

多线程面试题有哪些?答案详解