`

模拟2个线程操作共享资源时的如何交互

    博客分类:
  • Java
 
阅读更多

模拟2个线程操作共享资源时的如何交互

 

package thread;

/**
 * 简单的2个线程间交替执行示例
 * 通过synchronized保证对资源的“原子操作”不被打断 
 * 通过线程通信实现切换运行
 */
public class TwoThreadsCommunication {
	
	
	public static void main(String[] args) {
		
		new TwoThreadsCommunication().justDoIt();
		
	}
	
	public void justDoIt() {
		
		final ResourceHandler r = new ResourceHandler();
		
		
		new Thread(new Runnable() {
			public void run() {
				for(int i=0;i<100;i++)
					r.produce();
			}
		}, "线程A").start();
		
		new Thread(new Runnable() {
			public void run() {
				for(int i=0;i<100;i++)
					r.consume();
			}
		}, "线程B").start();
	}
	
	
	/**
	 * 资源类
	 * 
	 * 将多线程操作的代码单独封装起来,然后在run()中通过对象来调用
	 * 将同步放到资源上,而不是在run()中进行控制,实现与具体线程的解耦
	 * 互斥不要放到线程上进行,而应该放到对资源类操作的方法中!!!
	 */
	class ResourceHandler {
		
		//状态变量在资源内部进行操作
		private boolean full;
		
		//生产线程操作共享资源的方法
		public synchronized void produce() {
			//notice: 这里用while,不要用if。可防止死锁!
			while(full) {
				try {
					this.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			for(int i=1;i<=10;i++) {
				System.out.println(Thread.currentThread().getName()+" run***" + i);
			}
			full = true;
			this.notify();
		}
		
		//消费线程操作共享资源的方法
		public synchronized void consume() {
			//notice: 这里用while,不要用if。可防止死锁!
			while(!full) {
				try {
					this.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			for(int j=1;j<=10;j++) {
				System.out.println(Thread.currentThread().getName()+" run******" + j);
			}
			full = false;
			this.notify();
		}
		
	}
}

 

分享到:
评论

相关推荐

    操作系统设计 多线程同步模拟(C++版)

    **多线程** 是指在一个进程中同时执行多个线程,这些线程共享进程的资源,如内存空间,但每个线程都有自己独立的执行流。多线程技术可以提高应用程序的响应速度和并发能力,尤其在GUI(图形用户界面)应用中,它可以...

    【源码】[疑难]在单线程中模拟多线程的工作模式

    描述中提到的“把单线程中的COM组件对象(ActiveX等)线程共享,模拟为多线程”,暗示了我们需要处理COM组件的线程兼容性问题。COM设计了一套线程模型来保证跨线程操作的正确性,其中包括MTA(Multi-Threaded ...

    java模拟线程死锁

    Java 模拟线程死锁 线程死锁 在 Java 中,线程死锁(Deadlock)是一种特殊的情况,发生在两个或多个线程之间的互相等待对方释放资源的状态。这种情况下,各个线程都在等待其他线程释放资源,而自己也占用着其他...

    模拟线程 C#

    Mutex允许一次只有一个线程访问共享资源,Semaphore可以控制同时访问资源的线程数量,而Monitor则基于对象的锁进行同步。 3. **线程池**:C#的ThreadPool类提供了一个线程池,它是一组预创建的线程,可以复用以提高...

    模拟jdbc多线程竞争资源---【Eclipse项目】

    - **锁**:通过在Java中使用synchronized或Lock来控制对共享资源的访问,确保同一时间只有一个线程能执行特定操作。 - **并发集合**:使用并发友好的集合,如ConcurrentHashMap,可以在多线程环境下安全地存储和...

    银行取号模拟系统(多线程模拟实现)

    3. 互斥量(Mutex):保证同一时间只有一个线程可以访问共享资源,如号码池。 四、声音文件的处理 为了提升用户体验,系统包含了声音文件的播放。在VC中,可以通过WinMM库或者DirectX库来处理声音播放。例如,使用...

    线程调度模拟软件

    在计算机科学和操作系统领域,线程调度是至关重要的一个环节,它涉及到多任务并行处理和资源分配。线程是操作系统中的基本执行单元,它允许程序同时执行多个独立的流程。线程调度就是操作系统如何决定哪个线程应该在...

    一个多线程模拟购票系统

    由于多个线程可能同时访问和修改共享资源(如剩余票数),因此必须采取同步机制来防止数据不一致。Java提供了`synchronized`关键字、`ReentrantLock`等同步工具,用于控制对共享资源的访问。在这个系统中,购票操作...

    java程序 两个线程实现学生成绩的读写

    1. **数据同步**:确保在读写操作时对共享数据的访问是安全的,避免数据不一致。 2. **线程交互**:合理安排线程间的执行顺序,防止读写冲突。 3. **资源管理**:及时释放不再使用的资源,如关闭输入/输出流。 4. **...

    模拟多线程环境(源代码20130812)

    多线程是指在一个进程中同时执行多个线程,这些线程共享同一地址空间,能够并发地执行任务,提高系统的资源利用率和响应速度。在给定的项目中,开发者通过创建多线程环境,实现了命令行交互功能,如执行“dir”、...

    两个线程操作游戏原代码

    由于两个线程可能会访问共享资源,如游戏状态,因此需要使用线程同步机制,如互斥量(Mutex)、信号量(Semaphore)或条件变量(Condition Variable)来防止数据竞争。此外,线程间通信可能通过队列、管道或共享内存...

    java线程安全测试

    Java线程安全是多线程编程中的一个关键概念,它涉及到多个线程访问共享资源时可能出现的问题。在Java中,线程安全问题通常与并发、内存模型和可见性有关。Java内存模型(JMM)定义了如何在多线程环境下共享数据的...

    基于java swing的多线程电梯调度模拟

    为了保证线程安全,Java提供了synchronized关键字、 volatile变量、ReentrantLock等机制来控制对共享资源的访问。在这个电梯模拟中,电梯线程需要同步访问电梯状态和请求队列,以防止数据竞争和死锁问题。 Java 11...

    操作系统实验 多线程同步与互斥 java编写 有界面

    在“操作系统实验 多线程同步与互斥 java编写 有界面”的实验中,可能需要设计一个图形用户界面(GUI),通过按钮或事件触发线程的创建和同步操作,直观地展示线程间的交互和同步效果。例如,可以模拟银行账户转账,...

    模拟时钟(多线程)

    在本项目中,我们面临的是一个使用Java编程语言来模拟时钟的任务,这涉及到多线程的概念以及文件操作。下面将详细阐述这个项目的关键知识点。 首先,我们需要理解**多线程**的概念。在Java中,多线程允许程序同时...

    java多线程的应用事例

    当多个线程访问共享资源时,可能会出现竞态条件、死锁等问题。Java提供了多种工具来解决这些问题,如synchronized、volatile、ReentrantLock等。 线程的优先级也是重要概念,Java中的Thread类定义了线程优先级,但...

    线程模拟调度

    线程模拟调度是操作系统中的一个重要概念,特别是在多核处理器和多任务环境中,它对于系统性能优化和资源管理具有至关重要的作用。线程是程序执行的最小单元,而模拟调度则是指在软件层面模拟操作系统的线程调度机制...

    模拟操作系统源代码(VC# 2008)

    本项目提供了一个模拟操作系统的源代码,基于VC# 2008开发,对于学习操作系统原理和C#编程的开发者来说,这是一个非常有价值的实践平台。 1. **进程调度**:在操作系统中,进程调度是核心功能之一,它决定了哪个...

    基于Linux C语言的多线程模拟智能家具服务器源代码

    在本项目中,我们关注的是一个基于Linux操作系统,使用C语言编写的多线程智能家具服务器的源代码。这个服务器程序旨在模拟智能家居环境中的设备控制,可能是为了学习、实验或开发目的。以下是对这个项目中涉及的技术...

    多核和单核中多线程及单线程的特点

    在单核处理器上,操作系统通过时间片轮转的方式模拟多线程并发,使得每个线程都有机会获取CPU执行时间。而在多核处理器上,每个核心可以独立地执行一个线程,实现真正的并行处理,从而显著提高整体性能。多线程的...

Global site tag (gtag.js) - Google Analytics