多线程通信

简介: 多线程通信

多线程通信

多线程通信即多线程交互问题,举个例子:线程一网上下载音乐,线程二播放下载的音乐。

交互问题都可以归类为生产者和消费者问题:

生产者生产时消费者休眠,生产好后生产者唤醒消费者然后生产者休眠,消费者消费完之后再唤醒生产者然后消费者休眠,生产者还是工作。

在这里生产者和消费者各代表一个线程。

在Object类中有几个方法是用于多线程通信问题:

image.png

举例子

下面我们举一个关于生产者与消费者的例子:

厨师为生产者,服务员为消费者;

image.png


image.png

image.png

这里输出的结果是会出现问题,如图输出结果的一部分:

image.png

可以看到饭变成了有味,菜变成了无味。

原因是:setNameAndsetTaste中name和taste的设置中间隔了100毫秒,也就是在name设置好之后,服务员就过来把name和上次设置的,这次还未来得及从新设置的taste通过调用get()取走。

如何做:

使用线程安全解决?

此方法是行不通的,Cook和Waiter虽然操作的同一个堆内存,通过锁一个线程进去另外一个进不来,但是线程安全是非公平锁,有可能Cook出来后又立马抢到了锁又进去了一次,这回导致前面一次Cook产生的数据Waiter无法及时拿到。

只能使用消费者和生产者分别休眠进行解决。实现过程如下所示:

 

中间使用notifyAll和wait方法实现对线程的启动和休眠

相关文章
|
19天前
|
存储 Java 数据库连接
java多线程之线程通信
java多线程之线程通信
|
1月前
|
Python
如何在Python中实现线程之间的同步和通信?
【2月更文挑战第17天】【2月更文挑战第51篇】如何在Python中实现线程之间的同步和通信?
|
4月前
|
Java
线程间通信之Object.wait/notify实现
线程间通信之Object.wait/notify实现
30 0
|
4月前
|
消息中间件 存储 Unix
进程间通信和线程间通信总结
写在前面 面试的时候一定不要疲劳战,比如上午面了一个,然后中午不休息直接赶到另外一个相距比较远的公司,影响状态。 面试的时候一定不要紧张,不管对方有几个人,总之面试的时候做好充分准备,休息好,放松心态。 好了,言归正传,开始总结。
39 0
|
6月前
|
安全 Java 调度
Java多线程编程的默契对话:线程通信的艺术
Java多线程编程的默契对话:线程通信的艺术
38 0
|
5月前
19.3 Boost Asio 多线程通信
多线程服务依赖于两个通用函数,首先`boost::bind`提供了一个高效的、简单的方法来创建函数对象和函数对象适配器,它的主要功能是提供了一种将函数和它的参数绑定到一起的方法,这种方法可以将具有参数的成员函数、普通函数以及函数对象转化为不带参数的函数对象。当参数绑定后则下一步就需要使用多线程功能,Boost库中提供了`boost::thread`库,`boost::thread`可以用于创建线程、启动线程、等待线程执行结束以及线程间通信等多种操,有了这两个关键库那么我们只需要`accept.accept(*sock)`等待套接字上线,当有套接字上线后则自动创建`MyThread`子线程,
47 0
19.3 Boost Asio 多线程通信
|
4月前
|
安全 Java 数据库连接
详细介绍线程间通信
详细介绍线程间通信 线程间通信是指在多线程编程中,不同的线程之间通过某种方式交换信息的过程。这是一个重要的概念,因为线程之间的协作是实现复杂并发系统的关键。 下面是一些线程间通信的常见方式和示例:
359 0
|
1月前
|
消息中间件 并行计算 网络协议
探秘高效Linux C/C++项目架构:让进程、线程和通信方式助力你的代码飞跃
探秘高效Linux C/C++项目架构:让进程、线程和通信方式助力你的代码飞跃
35 0
|
1月前
|
存储 Java 数据库连接
线程通信(CountDownLatch、CyclicBarrier、Semaphore、Exchanger)
线程通信(CountDownLatch、CyclicBarrier、Semaphore、Exchanger)
34 0
|
6月前
|
并行计算 安全 Java
【JavaSE专栏80】多线程通信,多个线程之间如何实现信息传递和同步?
【JavaSE专栏80】多线程通信,多个线程之间如何实现信息传递和同步?