`

线程间通讯学习【二】

    博客分类:
  • Java
阅读更多
解决线程间通信的安全问题:同步锁的使用:

package com.zzl.thread;
/**
 * 线程间通讯
 * 所谓线程间通讯,即多个线程操作同一资源,但是操作的动作不同。
 * 
 */


class Resource{
	String name;
	String sex;
}
class InRunnable implements Runnable{
	private Resource r;
	public InRunnable(Resource r){
		this.r = r;
	}
	@Override
	public void run() {
		int x = 0;
		while(true){
			synchronized(r){
				if(x == 0){
					r.name = "mike";
					r.sex = "man";
				}else{
					r.name = "胖胖胖胖胖胖胖胖";
					r.sex = "女女女女女女";
				}
				x = (x+1)%2;
			}
		}
	}
	
}
class OutRunnable implements Runnable{
	private Resource r;
	public OutRunnable(Resource r){
		this.r = r;
	}
	@Override
	public void run() {
		while(true){
			synchronized(r){
				System.out.println(r.name+"    "+r.sex);
			}
		}
	}
	
}

public class ThreadCommunication {
	public static void main(String[] args) {
		Resource r = new Resource();
		
		InRunnable in = new InRunnable(r);
		OutRunnable out = new OutRunnable(r);
		
		Thread t1 = new Thread(in);
		Thread t2 = new Thread(out);
		
		t1.start();
		t2.start();
		
	}

}


添加同步锁后,问题解决:
胖胖胖胖胖胖胖胖    女女女女女女   
胖胖胖胖胖胖胖胖    女女女女女女   
胖胖胖胖胖胖胖胖    女女女女女女   
胖胖胖胖胖胖胖胖    女女女女女女   
胖胖胖胖胖胖胖胖    女女女女女女   
胖胖胖胖胖胖胖胖    女女女女女女   
胖胖胖胖胖胖胖胖    女女女女女女   
mike    man   
mike    man   
mike    man   
mike    man   
mike    man   
mike    man   
mike    man   
mike    man  
分享到:
评论

相关推荐

    JAVA100例之实例64 JAVA线程间通讯

    在"JAVA100例之实例64 JAVA线程间通讯"这个主题中,我们将深入探讨Java中实现线程间通信的几种主要方法。 1. **共享数据**:最直观的线程间通信方式是通过共享内存空间,即共享变量。只要对共享变量的操作是线程...

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

    学习这部分内容可以帮助开发者深入理解多线程编程,特别是如何在不违反线程安全规则的情况下进行界面与后台的通信。 总结来说,"界面线程工作线程之间的通讯"是一个关键的编程主题,涉及多线程同步、消息队列和线程...

    在Visual C++中利用自定义消息实现线程间通讯C++源代码程序小实例

    通过分析和学习这个代码,你可以更深入地理解如何在Visual C++中利用自定义消息进行线程间通信。 要注意的是,线程间通信还涉及同步问题,比如使用`Mutex`、`Semaphore`或`Event`等同步对象来避免数据竞争和死锁。...

    Qt多线程通讯

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

    Android AIDL线程间通讯样例项目

    总结,这个"Android AIDL线程间通讯样例项目"是学习和理解Android进程间通信机制的一个宝贵资源。通过分析和实践项目中的`Apdu_Client_Test`和`Apdu_Main_Test`,开发者可以深入掌握AIDL的工作方式,以及如何在实际...

    多线程串口通讯实例源码

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

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

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

    多线程之间通讯5.rar

    在IT领域,多线程是程序设计中的一个重要概念,特别是在并发执行和性能优化时。当一个应用程序需要...通过阅读“多线程之间通讯.docx”文档和观看“第五节(join()用法).mp4”视频,可以更深入地学习这些概念和技巧。

    多线程UDP通讯例子

    在实际应用中,我们还需要考虑线程同步问题,比如使用互斥锁(mutex)防止多个线程同时访问共享资源,使用条件变量(condition variable)来协调线程间的等待和唤醒等。此外,为了保证程序的健壮性,异常处理和错误...

    多线程事件对象通讯

    通过分析这些源码,我们可以学习到如何在实际项目中应用事件对象进行线程间的通信。 总之,多线程事件对象通讯是Windows编程中的重要概念,通过理解和掌握这一技术,开发者可以编写出更加高效和可靠的多线程程序。...

    csharp多线程示例(全)

    通过学习和实践这些C#多线程示例,开发者能够更好地掌握如何在应用程序中有效地使用多线程,提高程序的性能和用户体验。在实际项目中,应根据任务特性和系统需求选择合适的线程管理策略,确保程序的稳定性和效率。

    disruptor高性能Java线程间通讯库

    Disruptor是一款由LMAX交易所开发的开源Java框架,它专为高并发环境下的线程间通信设计,致力于提供极低的延迟和高效的性能。在Java开发中,尤其是在需要处理大量并发请求的系统中,Disruptor是一个重要的工具,它...

    tcp多线程socket通讯

    自己闲暇时候写的socket多线程通讯模型,代码虽然比较简单,但是比较容易扩展,麻雀虽小,五脏俱全。

    [233]多线程串口通讯例子,vc#开发的例子。代码比较简洁。但是有参考价值.zip上位机开发VC串口学习资料源码下载

    但是有参考价值.zip上位机开发VC串口学习资料源码下载[233]多线程串口通讯例子,vc#开发的例子。代码比较简洁。但是有参考价值.zip上位机开发VC串口学习资料源码下载[233]多线程串口通讯例子,vc#开发的例子。代码比较...

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

    以上知识点涵盖了C#中多线程串口通讯的基本原理和实践技巧,通过学习和掌握这些内容,开发者可以编写出高效、稳定的串口通信程序。在实际项目中,还需要根据具体需求和硬件环境调整和完善代码。

    异步和多线程socket通讯

    本文将深入探讨"异步和多线程socket通讯"这一主题,基于提供的描述和标签,我们将讨论如何利用多线程和异步机制来提升socket通信的效率和响应性。 首先,Socket是一种在应用程序与网络服务之间建立连接的接口,它...

    多线程编程学习资料(适合中级读者)

    "多线程编程之三——线程间通讯"是多线程编程中的一大重点。线程间通讯是为了实现不同线程之间的协作,通常包括共享数据、信号量、事件、消息队列等机制。这部分将详细解释这些通信方式的使用和注意事项,比如如何...

    易语言线程通信

    通过阅读和理解这部分代码,我们可以深入学习如何在易语言中实现高效的线程间通信。 总的来说,易语言线程通信涉及到了线程的创建、消息的发送与接收等关键操作。理解和掌握这些知识点,能够帮助开发者编写出更加...

    多线程串口通讯实例

    而"多线程串口通讯实例_622"可能是一个源码文件,包含了完整的VC++项目代码,供开发者参考和学习。 总结来说,这个实例为开发者提供了一个实践多线程串口通信的范例,通过VC++编程语言,展示了如何在多个串口通信中...

    多线程UDP通讯程序源代码

    本资源提供的"多线程UDP通讯程序源代码"就是一个很好的实践案例,它涉及到计算机网络中的用户数据报协议(UDP)和多线程编程技术。以下是关于这两个关键知识点的详细解释: 1. **用户数据报协议(UDP)**: UDP是...

Global site tag (gtag.js) - Google Analytics