`
javawangzilong
  • 浏览: 56895 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

线程通讯问题

阅读更多
//有一个数据存储空间,划分为两部分,一部分用于存储人的姓名,另外一部分用于存储人的性别。
//创建两个线程,一个用于向数据存储空间添加数据,另一个线程从数据存储空间取出数据
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多线程通讯

    在“Qt多线程通讯”DEMO中,主线程可能创建了一个`QThread`实例,并启动它。接着,一个工作对象(可能是自定义的QObject派生类)被移动到子线程中。这个工作对象可能会有一个接收参数的槽函数,用于处理主线程传递...

    WinForm后台线程与UI线程通讯

    在Windows Forms(WinForm)应用程序中,经常遇到需要在后台线程执行耗时操作,如数据处理、网络请求等,而这些操作的结果需要更新到用户界面...实践中,根据项目的具体需求和复杂性,可以选择最适合的线程通讯方案。

    VC多线程通讯

    本篇将深入探讨VC++中实现多线程通信的原理、方法以及常见问题。 1. **线程创建**: 在VC++中,我们可以使用`CreateThread`函数或者`_beginthreadex`函数来创建新的线程。`CreateThread`是Windows API提供的函数,...

    第一节(多线程通讯代码演示及解决线程安全问题)

    通过学习和理解上述知识点,并结合具体的代码演示(如第一节(多线程通讯代码演示及解决线程安全问题).mp4视频),开发者可以更有效地应对多线程编程中的挑战,编写出高效、稳定的多线程应用程序。

    界面线程工作线程之间的通讯

    在软件开发中,尤其是涉及到图形用户界面(GUI)的应用程序,界面线程和工作线程之间的通讯是一个重要的设计环节。界面线程,通常被称为主线程,负责处理用户交互和更新UI,而工作线程则用于执行耗时的操作,避免...

    c++ 多线程编程之三----线程间通讯

    C++ 多线程编程之三----线程间通讯 C++ 多线程编程中,线程间通讯是非常重要的一部分。线程间通讯可以让不同的...在实现线程间通讯时,我们需要考虑线程安全问题,使用互斥锁、信号量等机制来实现线程间通讯的安全性。

    c#编写串口通讯代码 多线程实现.rar_c# 串口多线程_c#编写串口通讯代码多线程实现_young5op_串口_串口通讯

    c#编写串口通讯代码多线程实现,逻辑与界面分离。发送与接收都为单独线程

    TCP/IP多线程通讯

    在多线程通讯中,还有一些常见问题需要注意,比如线程安全问题,即多个线程访问共享资源时可能导致数据不一致。此外,过多的线程可能会消耗大量系统资源,因此需要合理控制线程数量,例如设置线程池。还有,异常处理...

    c#编写串口通讯代码 多线程实现

    在多线程环境下实现串口通讯,可以提高程序的效率和响应性,避免因为串口读写操作阻塞主线程而导致应用无响应。以下是一些关于C#多线程串口通讯的关键知识点: 1. **System.IO.Ports命名空间**:这是C#中处理串口...

    C#.net同步异步SOCKET通讯和多线程总结

    C#.net同步异步SOCKET通讯和多线程总结 C#.net同步异步SOCKET通讯和多线程总结是指在C#.net环境下实现的同步异步套接字通信和多线程编程的总结。套接字(Socket)是tcp/ip网络协议接口,内部定义了许多的函数和例程...

    多线程串口通讯实例源码

    - 从提供的"多线程串口通讯实例"源码中,我们可以看到如何结合上述知识点,实现一个同时读取Excel数据和进行串口通信的程序。 - 源码可能包括一个主线程负责用户界面交互,一个或多个子线程用于串口通信,确保数据...

    QT+VS2017 多线程串口通讯,可供MFC调用

    QT+VS2017 多线程串口通讯是一个重要的技术主题,尤其对于需要进行高效数据传输的应用程序。在本文中,我们将深入探讨如何利用QT框架与Visual Studio 2017结合实现多线程串口通信,并且强调其在MFC(Microsoft ...

    多线程的线程同步,线程通讯,Lock锁

    多线程的线程同步,线程通讯,Lock锁

    多线程Socket通讯

    基于Socket通讯的服务器端,添加多线程,可以支持多个客户端同时连接,发送消息。

    SerialPortHelper 多线程串口通讯

    在开发串口通讯的时候一直用的微软的,顺序执行,后来找到一个可以用多线程的帮组类,共享给大家,本人测试过xmodel都可以使用 ,调试也很方便,

    java Socket多线程通讯实例

    本实例探讨的是如何利用Java的Socket实现TCP(Transmission Control Protocol)协议下的多线程通讯,允许一个服务端同时处理多个客户端的连接请求。 首先,TCP是一种面向连接的、可靠的、基于字节流的传输层通信...

    c#编写串口通讯代码 多线程实现.rar_C#串口_c# 串口多线程_c#多线程_串口多线程_串口通信

    串口通信的实现,编程环境为C#,实现技术采用了多线程方式

    多线程同步和通讯完整示例

    synchronized关键字提供了基本的线程同步,而wait-notify机制和Lock接口则提供了更高级的线程通讯和控制手段。在实际开发中,根据具体需求选择合适的同步策略,可以提高程序的效率和正确性。通过学习和实践...

    TCP服务(C#的多线程多客户端异步聊天通讯源码)

    本文将深入探讨一个基于C#的TCP服务实现,它利用了多线程、异步编程、拉姆达表达式、UI跨线程更新以及递归等技术,以实现一个能够支持多个客户端的异步聊天通讯系统。 首先,TCP(传输控制协议)是一种面向连接的、...

    ioking无锁线程通讯(no-lockl)demo

    在"ioking无锁线程通讯"的场景下,服务器可能使用多线程来处理并发连接,每个线程负责一个客户端连接,无锁技术使得这些线程能快速地交换消息,无需担心数据竞争问题。据描述,该系统能够达到每秒处理1450万笔消息,...

Global site tag (gtag.js) - Google Analytics