//有一个数据存储空间,划分为两部分,一部分用于存储人的姓名,另外一部分用于存储人的性别。
//创建两个线程,一个用于向数据存储空间添加数据,另一个线程从数据存储空间取出数据
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Q q=new Q();
Consumer con=new Consumer(q);
Producer pro=new Producer(q);
new Thread(con).start();
new Thread(pro).start();
}
}
class Q
{
private String name;
private String sex;
private boolean flag=false;
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
class Consumer implements Runnable //从Q中向外读取的一个线程;
{
private Q q;
public Consumer(Q q)
{
this.q=q;
}
public void run() {
// TODO Auto-generated method stub
while(true)
{
synchronized(q)
{
if(!q.isFlag())
try {
q.wait(); //读取的线程等待
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(q.getName()+":"+q.getSex());
q.notify(); //唤醒插入的线程
q.setFlag(false);
}
}
}
}
class Producer implements Runnable //向Q中插入的一个线程;
{
private Q q;
private int i=0;
public Producer(Q q)
{
this.q=q;
}
public void run() {
// TODO Auto-generated method stub
while(true)
{
synchronized(q)
{
if( q.isFlag())
try {
q.wait();
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
if(i%2==0)
{
q.setName("zhangsan");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
q.setSex("male");
}
else
{
q.setName("lisi");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
q.setSex("female");
}
q.notify(); //唤醒读取的线程
q.setFlag(true);
}
i++;
}
}
分享到:
相关推荐
在“Qt多线程通讯”DEMO中,主线程可能创建了一个`QThread`实例,并启动它。接着,一个工作对象(可能是自定义的QObject派生类)被移动到子线程中。这个工作对象可能会有一个接收参数的槽函数,用于处理主线程传递...
在Windows Forms(WinForm)应用程序中,经常遇到需要在后台线程执行耗时操作,如数据处理、网络请求等,而这些操作的结果需要更新到用户界面...实践中,根据项目的具体需求和复杂性,可以选择最适合的线程通讯方案。
本篇将深入探讨VC++中实现多线程通信的原理、方法以及常见问题。 1. **线程创建**: 在VC++中,我们可以使用`CreateThread`函数或者`_beginthreadex`函数来创建新的线程。`CreateThread`是Windows API提供的函数,...
通过学习和理解上述知识点,并结合具体的代码演示(如第一节(多线程通讯代码演示及解决线程安全问题).mp4视频),开发者可以更有效地应对多线程编程中的挑战,编写出高效、稳定的多线程应用程序。
在软件开发中,尤其是涉及到图形用户界面(GUI)的应用程序,界面线程和工作线程之间的通讯是一个重要的设计环节。界面线程,通常被称为主线程,负责处理用户交互和更新UI,而工作线程则用于执行耗时的操作,避免...
C++ 多线程编程之三----线程间通讯 C++ 多线程编程中,线程间通讯是非常重要的一部分。线程间通讯可以让不同的...在实现线程间通讯时,我们需要考虑线程安全问题,使用互斥锁、信号量等机制来实现线程间通讯的安全性。
c#编写串口通讯代码多线程实现,逻辑与界面分离。发送与接收都为单独线程
在多线程通讯中,还有一些常见问题需要注意,比如线程安全问题,即多个线程访问共享资源时可能导致数据不一致。此外,过多的线程可能会消耗大量系统资源,因此需要合理控制线程数量,例如设置线程池。还有,异常处理...
在多线程环境下实现串口通讯,可以提高程序的效率和响应性,避免因为串口读写操作阻塞主线程而导致应用无响应。以下是一些关于C#多线程串口通讯的关键知识点: 1. **System.IO.Ports命名空间**:这是C#中处理串口...
C#.net同步异步SOCKET通讯和多线程总结 C#.net同步异步SOCKET通讯和多线程总结是指在C#.net环境下实现的同步异步套接字通信和多线程编程的总结。套接字(Socket)是tcp/ip网络协议接口,内部定义了许多的函数和例程...
- 从提供的"多线程串口通讯实例"源码中,我们可以看到如何结合上述知识点,实现一个同时读取Excel数据和进行串口通信的程序。 - 源码可能包括一个主线程负责用户界面交互,一个或多个子线程用于串口通信,确保数据...
QT+VS2017 多线程串口通讯是一个重要的技术主题,尤其对于需要进行高效数据传输的应用程序。在本文中,我们将深入探讨如何利用QT框架与Visual Studio 2017结合实现多线程串口通信,并且强调其在MFC(Microsoft ...
多线程的线程同步,线程通讯,Lock锁
基于Socket通讯的服务器端,添加多线程,可以支持多个客户端同时连接,发送消息。
在开发串口通讯的时候一直用的微软的,顺序执行,后来找到一个可以用多线程的帮组类,共享给大家,本人测试过xmodel都可以使用 ,调试也很方便,
本实例探讨的是如何利用Java的Socket实现TCP(Transmission Control Protocol)协议下的多线程通讯,允许一个服务端同时处理多个客户端的连接请求。 首先,TCP是一种面向连接的、可靠的、基于字节流的传输层通信...
串口通信的实现,编程环境为C#,实现技术采用了多线程方式
synchronized关键字提供了基本的线程同步,而wait-notify机制和Lock接口则提供了更高级的线程通讯和控制手段。在实际开发中,根据具体需求选择合适的同步策略,可以提高程序的效率和正确性。通过学习和实践...
本文将深入探讨一个基于C#的TCP服务实现,它利用了多线程、异步编程、拉姆达表达式、UI跨线程更新以及递归等技术,以实现一个能够支持多个客户端的异步聊天通讯系统。 首先,TCP(传输控制协议)是一种面向连接的、...
在"ioking无锁线程通讯"的场景下,服务器可能使用多线程来处理并发连接,每个线程负责一个客户端连接,无锁技术使得这些线程能快速地交换消息,无需担心数据竞争问题。据描述,该系统能够达到每秒处理1450万笔消息,...