- 浏览: 91480 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (148)
- 全文检索 (1)
- java (29)
- xml (2)
- json (2)
- redis springmvc (1)
- Redis (5)
- 开发常识 (1)
- tomcat (2)
- 单元测试Junit (2)
- 设计模式 (2)
- spring (10)
- jvm (2)
- eclipse (4)
- echart (1)
- mybatis (1)
- mysql (3)
- web (1)
- js (2)
- PL/SQL (2)
- 其他 (1)
- 人生 (1)
- 安全 (2)
- jsp (2)
- 硬件电脑 (1)
- linux (3)
- git (10)
- oracle (8)
- ant (1)
- maven (2)
- 正则表达式 (2)
- chrome (1)
- 面试 (6)
- 多线程 (19)
- bug (11)
- java工具类 (3)
- 算法 (1)
- bug,git (1)
- shell (2)
- springmvc (2)
- Java8 (1)
- 消息队列-rocketmq (1)
- es (1)
- dubbo (0)
- spring cloud (0)
- hashmap (0)
- springboot (1)
- velocity (0)
package com.jbx.xiezuo; /** * 采用信号量和同步方法使发送线程与接收线程同步运行。 * * @author Administrator * value是共享变量,put()和get()方法都要对value进行操作。由于put()和get()方法针对同一个数据进行相反操作; * 当value为空时,put()方法可以赋值而get()方法不可以赋值,必须等待; * 反之,当value不为空时,get()方法可以取值,而put()方法不可以赋值,必须等待。 * 因此,put()和get()方法必须以value是否为空值作为标记互斥地、交替地进行。 * */ public class BufferLock { // 加互斥锁的缓冲区 private int value; private boolean isEmpty = true; // value是否为空的信号量 public synchronized void put(int i) { while (!isEmpty) // 当value不为空时,等待 try { this.wait(); } catch (InterruptedException e) { } value = i; // 当value为空时,value获得值 isEmpty = false; // 设置value为不空状态 notify(); // 唤醒其他等待线程 } public synchronized int get() { // 同步方法 while (isEmpty) // 当value为空时等待 try { this.wait(); } catch (InterruptedException e) { } isEmpty = true; // 设置value为空状态,并返回值 notify(); return value; } public static void main(String[] args) { BufferLock buffer = new BufferLock(); (new Sender(buffer)).start(); (new Receiver(buffer)).start(); } } class Sender extends Thread { // 发送线程类 private BufferLock buffer; // 用于交换数据的共享变量 public Sender(BufferLock buffer) { // 指定缓冲区 this.buffer = buffer; } public void run() { for (int i = 1; i < 6; i++) { // 连续向缓冲区发送若干数据 buffer.put(i); System.out.println("Sender put: " + i); } } } class Receiver extends Thread { // 接收线程类 private BufferLock buffer; public Receiver(BufferLock buffer) { this.buffer = buffer; } public void run() { for (int i = 1; i < 6; i++) { // 连续从缓冲区接收若干数据 System.out.println("\t\t Receiver get:" + buffer.get()); } } }
运行结果:
Sender put: 1
Sender put: 2
Receiver get:1
Receiver get:2
Sender put: 3
Receiver get:3
Sender put: 4
Receiver get:4
Sender put: 5
Receiver get:5
解析:
其中,isEmpty是标记value是否为空的一个信号量,当value为空时,isEmpty值为true;当value不空时,isEmpty值为false。
在put()方法中,先查看信号量的状态,如果是isEmpty值为true,表示value为空,可以对value赋值,之后唤醒一个等待接收线程;否则表示value不空,即value值未被取走,此时不能对value赋值,只能等待。
在get()方法中,先查看信号量的状态,如果isEmpty值为true,表示value未赋值,此时取不到有效value值,只能等待;否则表示value不空,返回value值,并唤醒一个等待发送线程。
两个线程分别调用put()和get()方法执行流程如图所示。
运行结果,不同线程之间实现了同步传递数据。
注意:在互斥的put()和get()方法中,如果只有wait()方法而没有notify()方法,则线程死锁。
发表评论
-
ThreadPoolExecutor线程池参数详解
2019-01-09 00:06 477参考:https://www.cnblogs.com/wayt ... -
解决线程同步问题的思路
2018-07-31 16:35 418线程同步机制 操作系统中实现线程同步有一种工 ... -
线程间的协作关系与线程同步
2018-07-30 16:21 5281.线程间的协作关系 当一个进程中的多个线程为完成同 ... -
带互斥锁的并发线程执行流程
2018-07-30 12:38 449... -
线程间的竞争关系与线程互斥
2018-07-30 11:19 672线程间的竞争关系与线 ... -
线程的同步机制
2018-07-17 11:31 385线程的同步机制 (一) ... -
3个线程,A,B,C,这三个线程分别只能打印 “a”,“b”,“c”,怎么让这三个线程依次打印“abc"
2018-07-17 11:19 351package com.jbx.thread; /* ... -
定时器与图形动画设计
2018-07-17 11:15 0动画(animation) 都是利用人眼的视 ... -
线程分类
2018-07-17 09:10 325线程分类: 线程可分为用户线程(user thread) ... -
线程优先级
2018-07-17 09:08 358Java提供10个等级的线程优先级,分别用1~10表示,优先级 ... -
设计滚动字演示线程状态及改变方法
2018-07-16 16:17 303本例演示线程对象的生 ... -
线程对象的生命周期
2018-07-16 11:28 361线程对象的生命周期 1.Thread.State类声明的线程状 ... -
声明实现Runnable接口的奇数/偶数序列线程
2018-07-11 14:02 427package com.jbx.thread; ... -
声明继承Thread类的奇数/偶数序列线程
2018-07-10 23:58 419package com.jbx.com; /** ... -
Java的线程对象Runnable接口和Thread类
2018-07-10 21:42 399Java支持内置的多线程机制。 Java语言包中的Runnab ... -
并发程序设计
2018-07-09 17:22 275并发程序设计 1.顺序程 ... -
线程介绍
2018-07-09 16:55 298线程 1.引入线程机制的 ... -
进程介绍
2018-07-09 15:38 378进程 进程的定义和属性 进程是一个可并发执行的 ... -
多线程
2018-07-09 14:31 313...
相关推荐
【标题】"基于UDP协议的多线程高速接收QT工程"揭示了这个项目的核心技术是使用UDP协议进行高速数据接收,并结合多线程技术来处理海量数据,且它是在QT框架下实现的。QT是一个流行的跨平台应用程序开发框架,特别适合...
此外,本文还详细介绍了多线程设计思想在条件接收系统中的应用,并通过实际运行系统实例验证了其可行性。通过这些方法,多线程技术在条件接收系统中的应用不仅保证了实时性,同时也提高了系统效率和稳定性。 中国...
例如,一条线程负责发送数据,另一条线程负责接收数据,这样即使在接收数据时也可以发送新的数据,避免了串行操作可能造成的延迟。 其次,串口通信是一种常见的硬件接口,用于设备间的串行数据传输。它基于RS-232、...
例如,TCP协议的滑动窗口机制可以用来动态调整发送速率,以适应网络状况。 总的来说,"基于MFC的Socket类的多线程文件传输"涉及到的知识点包括: 1. MFC框架和CSocket类:理解MFC的类库结构,以及如何使用CSocket...
例如,在给定的代码片段中,可以看到多个与串口相关的控件和变量,如`MSCommIn`和`MSCommOut`,它们分别用于接收和发送数据。`cmbbxSerialIn`和`cmbbxSerialOut`用于选择串口设备,而`cmbbxBaudIn`和`cmbbxBaudOut`...
- **Amq_Producer_mt.cpp**:扩展了 Amq_Producer.cpp,增加了多线程支持,每个线程独立发送消息,提高消息发送速率。 - **Amq_Consumer.cpp**:消费者客户端的实现,负责接收和处理来自 ActiveMQ 服务器的消息。 ...
每个线程可以独立地执行特定的任务,例如在TCP协议实现中,一个线程可能负责接收数据,另一个线程则负责发送数据。 2. **TCP协议**: - TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议...
WinSock是Windows平台上的网络编程接口,提供了TCP/IP协议栈的功能,用于建立和维护网络连接,发送和接收数据。 5. **错误处理与异常安全**:在多线程环境中,错误处理尤为重要,因为线程可能会因各种原因失败。...
在多线程编程中,线程间的通信是一个关键的概念,特别是在复杂的系统中,主线程与工作线程的协作是确保程序高效、稳定运行的基础。本文将深入探讨标题和描述所提及的“主线程和工作线程相互之间的通信示例程序”,并...
通过学习和分析这些代码,开发者可以更好地理解和应用Qt的多线程与网络编程技术。 总结起来,Qt的线程池和网络模块为实现高效、可控的多线程HTTP下载提供了便利。通过合理设计和优化,我们可以创建一个既能充分利用...
为了实现这一功能,程序可能使用了某种计时机制,记录图片数据从发送到接收的时间,并根据图片大小计算传输速率。这通常涉及到时间戳的处理和数据统计,以便实时反馈给用户。 在具体实现上,VC环境提供了丰富的...
6. **确认与校验**:为了保证数据完整性,通常会在接收端进行校验,如计算MD5或CRC值,确保接收到的数据与发送的数据一致。 7. **关闭连接**:文件传输完成后,客户端和服务器端都需要关闭socket连接。 在这个项目...
QT+UDP实时视频发送与接收是一个关于利用QT框架和UDP协议进行实时视频数据传输的项目。这个项目包含发送端和接收端两个独立的工程,旨在实现高效、低延迟的视频流传输。 首先,QT(Qt)是一个跨平台的应用程序开发...
- **同步与互斥**:在多线程环境中,为了避免数据竞争和不一致性,需要使用锁、信号量等机制进行同步和互斥控制。 2. **TCP**: - **面向连接**:TCP是一种面向连接的传输层协议,它在数据传输前先建立连接,确保...
3. 错误检测:检查文件完整性,如MD5校验,确保上传的文件与原文件一致。 4. 并发控制:服务端可能需要限制并发连接数,避免过载。 五、BS架构中的交互 1. JavaScript或AJAX:在浏览器端,使用JavaScript或AJAX异步...
发送线程则可以在数据准备好后立即发送,无需等待接收线程完成操作。这样的设计提高了程序的响应性和实时性。 4. ** MulThreadMFC项目**: 根据提供的压缩包文件名,这个项目很可能是使用MFC库创建的一个多线程...
然而,需要注意的是,线程可能在处理任务时无法立即停止,因此通常需要在线程类中实现一个循环,以便在接收到终止请求时能够优雅地结束。 最后,为了解决资源泄漏问题,每个线程在其`Execute`方法执行完毕后,应...
该库提供了打开、关闭串口,发送和接收数据,设置波特率、校验位、停止位等参数的功能。 **3. 多线程** 在GUI应用中,为了保持界面的响应性和流畅性,串口读写操作通常应在后台线程中执行,而不是主线程。Python的`...
此外,这种技术还能根据网络状况动态调整每个线程的下载速率,以最大化整体性能。 断点续传是多线程下载中的另一个关键特性。它允许用户在下载过程中随时暂停,然后在稍后的时间点继续下载,而不会丢失已经下载的...