`

多线程:模拟追女孩共享数据,但不共享代码

阅读更多
/**
 * 
 * 
 * 	模拟一个场景:Meten和Eric同时喜欢上了一个妹妹Janet,这两个人就开始追了Eric追Janet的方式是牺牲色相,他追了50次,
 * Meten追Janet的方式用的是金钱, 他追了30次
 * 在追的过程中,如果打印meten的追女孩子的方式有一次是色相,那么这个程序就错了   
 * 或者如果打印Eric追女孩子的方式有一次是金钱,那么这个程序就错了
 * 提醒:共享数据,但不共享代码
 * @author 够潮
 *
 */
public class Demo15 {

	 /**
	  * 共享数据的时候,为了防止出现脏数据,应加锁
	  */

	public static void main(String[] args) {
		Janet j = new Janet();
		Eric e = new Eric(j,"Eric");
		Meten m = new Meten(j,"Meten");
		e.start();
		m.start();
	}

}
class Janet {
	/**
	 * 共享的数据
	 */
	String msg;
	
	public String getMsg() {
		return msg;
	}

	/**
	 * 对共享的数据进行加锁
	 * @param msg
	 */
	public synchronized void setMsg(String msg) {
		this.msg = msg;
		System.out.println(Thread.currentThread().getName()+"说:"+this.getMsg());
	}
	
	
}
class Meten extends Thread{
	Janet j;
	public Meten(Janet j, String name) {
		super(name);
		this.j = j;
	}
	
	public void run(){
		for( int i = 0; i < 30; i++ ){
			this.j.setMsg("使用金钱");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
}
class Eric extends Thread{
	Janet j;
	public Eric(Janet j,String name) {
		super(name);
		this.j = j;
	}
	
	public void run(){
		for( int i = 0; i < 50; i++ ){
			this.j.setMsg("牺牲色相");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
	}
}

 

0
2
分享到:
评论

相关推荐

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

    用惯了单线程的朋友们,有没有想过把单线程中的COM组件对象(ActiveX等)线程共享,模拟为多线程呢?

    VC模拟实现管道缓存,可多线程共享数据。

    做多媒体应用,经常需要在各线程间共享数据,本例子介绍了一种简便的缓存管理办法。 特点: 1. 初始申请一个缓存区,模拟管道操作,从末尾写入,从开头读取。 2. 线程安全,写入,读取块大小无限制。 3. 代码简单,...

    中软卓越Java模拟面试课堂:97-多线程共享数据.pptx

    java

    基于多线程的电梯调度模拟仿真系统 开题报告

    Java的多线程机制能够很方便地创建和运行多个独立的线程的程序,并且可以创建多个同步线程,实现多个任务的同步执行,这一机制对于实现资源共享、防止“死锁”现象的出现极为有用。多线程的程序能更好地表达和解决具体...

    Buy多线程开发

    模拟多线程共享数据~购票

    java模拟多线程买票问题.docx

    多线程买票是java中的一个经典案例,其主要思想无非包括2点,synchronized和锁,两者中,前者实现同步,后者为同步的线程提供锁,从而实现多个线程共享同一份资源时候,能够同步进行; 经典的方式是synchronized + 锁...

    Java高级程序设计-多线程(二).pptx

    本章内容 掌握同步代码块的使用 掌握同步方法的使用 理解线程死锁 掌握 ThreadLocal 类的使用 使用多线程模拟猴子采花 使用同步方法模拟购票 使用多线程模拟购物订单生成 使用 ThreadLocal 类模拟银行取款 Java高级...

    用C#实现的多线程同步打印文章(windows操作系统实验)

    本实验通过设计两个线程,一个是文章下载线程和一个文章打印线程,用来实现模拟线程同步打印机,文章下载线程实现把文章下载到缓冲区,文章打印线程实现把文章打印出来。

    110104010104.rar_MFC多任务_MFC多线程挂起_mfc 多线程_mfc 生产者

    线程是程序独立运行的基本单位,一个程序通过执行多个线程可以提高机器本身资源的利用率,同时也可以完成多任务并行运行的操作,多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。 互斥体 互斥体与临界区...

    操作系统课程设计生产者和消费者问题源代码

    在Windows2000环境下,创建一个控制台进程,在此进程中创建n个线程来模拟生产者或者消费者。这些线程的信息由本程序定义的“测试用例文件”中予以指定。 该文件的格式和含义如下: 3 1 P 3 2 P 4 3 C 4 1 4 P 2 5 C ...

    Linux系统编程之线程同步

    所以,互斥锁实质上是操作系统提供的一把“建议锁”(又称“协同锁”),建议程序中有多线程访问共享资源的时候使用该机制。但,并没有强制限定。 因此,即使有了mutex,如果有线程不按规则来访问数据,依然会造成...

    共享自己所做的JAVA实验代码

    共享自己所做的JAVA实验代码。包括模拟手机,多线程,APPLET,坐标等等。

    php多进程框架-模拟java多线程接口simple-fork-php.zip

    SimpleFork提供一套类似于JAVA多线程的进程控制接口,提供回收、同步、互斥、通信等方案,开发者可以关注业务问题,不需要过多考虑进程控制。 引入 composer require jenner/simple_fork require path/to/...

    eventor:多线程,进程,协程 任务执行器

    使用多线程,进程以及协程实现的任务执行器,加快任务执行(针对IO密集型任务) description 1.Eventor类,初始化参数如下: threadcount: 开启多少个线程 taskunitcount: 每个线程处理多少任务 func: 实际的处理任务的...

    操作系统课设用多进程同步方法演示“生产者-消费者”问题

    5) 多个生产者或多个消费者之间必须有共享对缓冲区进行操作的函数代码 6) 每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前生产者与消费者的指针位置,以及生产者和消费者线程标识符 ...

    Phoenix:一个带有Java,RMI和多线程的小项目

    这个项目的规范很严格:我们必须使用RMI在Java中开发一个多线程环境来支持此Car Sharing。 结构 该项目包括三个部分: Base , Server和Client 。 即使每个部分都用其名称描述了自己,我们仍将在下面的列表中逐一...

    C#语言Semaphore类用法实例(多线程多端口使用端口控制)

    C#语言Semaphore类用法实例,多线程 用于有多个同类型共享资源(比如端口)时,如何协调端口分配给线程访问资源的问题,是一个简单模拟实例(源代码)。

    以太网CSMD/CD协议仿真

    按照CSMA/CD算法模拟以太网同一网段(同一冲突域)中多台主机共享总线的实现过程。 (1) 用线程模拟Ethernet上的主机; (2) 线程向总线发送数据.数据中包含该线程的线程号; (3) 发送的流程须遵循CSMA/...

    java-os.rar_多进程os

    此次操作系统,本人使用java中的多线程来模拟多进程共享临界资源。java中多线程就是一个类或一个程序执行或管理多个线程执行任务的能力,每个线程可以独立于其他线程而独立运行,当然也可以和其他线程协同运行,一个...

    东华大学 操作系统实验 读者写者问题 含源代码和报告

    1 实验目标 能够编写程序模拟读者 写者问题 ... 在Windows2000环境下 创建一个控制台进程 此进程包含n个线程 用这n个线程来表示n个读者或写者 每个线程按相应测试数据文件 后面有介绍 的要求进行读写操 [更多]

Global site tag (gtag.js) - Google Analytics