`

144_多线程(线程间通信-等待唤醒机制)

阅读更多
class Res{
	String name;
	String sex;
	boolean flag =  false;
}

class Input implements Runnable{
	private Res r;

	Input(Res r){
		this.r = r;
	}
	public void run(){
		int x = 0;
		while(true){
			synchronized(r){
				if(r.flag)
					try{r.wait();}catch(Exception e){}
				if(x==0){
					r.name = "mike";
					r.sex = "man";
				}
				else{
					r.name = "哈哈";
					r.sex = "女";
				}
				x = (x+1)%2;
				r.flag = true;
				r.notify();
			}
		}
	}
}

class Output implements Runnable{
	private Res r;
	Output(Res r){
		this.r = r;
	}
	public void run(){
		while(true){
			synchronized(r){
				if(!r.flag)
					try{r.wait();}catch(Exception e){}
				System.out.println(r.name+"--"+r.sex);
				r.flag = false;
				r.notify();
			}
		}
	}
}

class InputOutput{
	public static void main(String[] args){
		Res r = new Res();
		
		Input in = new Input(r);
		Output out = new Output(r);
		
		Thread t1 = new Thread(in);
		Thread t2 = new Thread(out);
		
		t1.start();
		t2.start();
	}
}
/*
wait();notify();notifyAll();
都使用在同步中,因为要对持有监视器(锁)的线程中操作。
所以要使用在同步中,因为只有同步才具有锁。

为什么这些操作线程的方法要定义在Object类中呢?
因为这些方法在操作同步的线程时,都必须要标识它们所操作
线程持有的锁。只有同一个锁上的被等待线程,可以被同一个锁上的
notify唤醒。不可以对不同锁中的线程进行唤醒。
也就是说,等待和唤醒必须是同一个锁。
而锁可以是任意对象,所以可以被任意对象调用的方法定义在Object
类中。
*/

代码优化
class Res{
	private String name;
	private String sex;
	private boolean flag =  false;
	
	public synchronized void set(String name,String sex){
		if(flag){
			try{this.wait();}catch(Exception e){}
		}
		this.name = name;
		this.sex = sex;
		
		flag = true;
		this.notify();
	}
	
	public synchronized void out(){
		if(!flag){
			try{this.wait();}catch(Exception e){}
		}
		System.out.println(name+"--"+sex);
		flag = false;
		this.notify();
	}
}

class Input implements Runnable{
	private Res r;

	Input(Res r){
		this.r = r;
	}
	public void run(){
		int x = 0;
		while(true){
			if(x==0){
				r.set("mike","man");
			}
			else{
					r.set("哈哈","女");
			}
			x = (x+1)%2;
		}
	}
}

class Output implements Runnable{
	private Res r;
	Output(Res r){
		this.r = r;
	}
	public void run(){
		while(true){
			r.out();
		}
	}
}

class InputOutput{
	public static void main(String[] args){
		Res r = new Res();
		
		new Thread(new Input(r)).start();
		new Thread(new Output(r)).start();
		
		/*Input in = new Input(r);
		Output out = new Output(r);
		
		Thread t1 = new Thread(in);
		Thread t2 = new Thread(out);
		
		t1.start();
		t2.start();*/
	}
}
分享到:
评论

相关推荐

    传智播客_张孝祥_传统线程同步通信技术

    在IT行业中,线程同步通信技术是多线程编程中的核心概念,特别是在高并发和分布式系统设计中。张孝祥老师的课程"传智播客_张孝祥_传统线程同步通信技术"深入浅出地讲解了这一主题,旨在帮助开发者理解和掌握线程间的...

    vc++ multithread多线程教程---线程通信--利用事件对象,线程同步--使用信号量,线程同步--使用互斥量,线程同步--使用临界区

    事件对象是Windows API中用于线程间通信的一种同步机制。它可以被设置为有信号状态或无信号状态,线程通过WaitForSingleObject或WaitForMultipleObjects函数等待事件状态的改变。事件对象主要有两种类型:手动重置...

    27_多线程_第2天(线程安全、线程同步、等待唤醒机制、单例设计模式)_讲义

    然而,多线程环境下也会带来一系列问题,如数据不一致性、资源竞争等,因此,理解线程安全、线程同步以及等待唤醒机制至关重要。此外,单例设计模式在确保一个类只有一个实例的同时,提供了全局访问点,也是多线程...

    linux_code.rar_linux 多线程_linux 线程_多线程编程

    - **线程间的通信可以通过共享内存、管道、消息队列、套接字等方式实现。** 6. **线程调度策略**: Linux提供多种线程调度策略,如SCHED_OTHER(默认,轮转),SCHED_FIFO(先入先出,实时),SCHED_RR(时间片...

    Testserver_Linux.rar_Testserver_Linux_多线程通信

    `pthread_create()`函数用于创建新线程,`pthread_join()`用于等待线程结束,`pthread_mutex_t`用于同步线程,防止数据竞争,`pthread_cond_t`用于线程间的条件等待和唤醒。 其次,服务器端的多线程通信涉及到网络...

    C#多线程_c#多线程_C#_多线程_

    - `Channel`:C# 6.0以后引入,用于高效、安全的线程间通信。 7. **线程状态**: - 新建(New):线程刚刚创建,尚未启动。 - 运行(Running):线程正在执行。 - 可运行(Runnable):线程准备好运行,但等待...

    27_多线程_第2天(线程安全、线程同步、等待唤醒机制、单例设计模式)_讲义.doc

    等待唤醒机制是Java中通过`wait()`、`notify()`和`notifyAll()`方法实现的一种线程间的通信方式。当一个线程调用`wait()`方法时,它会释放当前持有的锁并进入等待状态,直到其他线程调用`notify()`或`notifyAll()`...

    学习多线程之一:线程通信--利用事件对象.zip_线程通信

    在多线程编程中,线程通信是一个至关...总之,线程通信是多线程编程中的基础,而事件对象是实现线程间通信的一种有效方式。通过学习和实践,你将能够熟练地在你的程序中应用这些技术,提升多线程程序的效率和可靠性。

    FreeRTOS_Reference_Manual_V10.0.0----接口介绍_Freertos参考手册_

    4. **事件标志组(Event Flags)**:事件标志组允许任务等待一组条件中的一个或多个发生,提高了任务间通信的灵活性。任务可以通过组合不同的标志来决定何时唤醒。 5. **队列(Queues)**:FreeRTOS中的队列用于...

    Windows多线程编程技术与实例-源代码

    - **事件对象(Event)**:用于线程间的通信和同步,可以实现线程唤醒、等待等操作。 - **临界区(Critical Section)**:轻量级同步机制,用于保护一小段代码区域不被并发访问。 4. **线程通信**: - **消息...

    Java线程间的通信----生产者消费者模型

    在Java编程中,线程间的通信是多线程编程中的一个重要概念,特别是在处理并发和协作任务时。生产者消费者模型是一种经典的线程同步问题,它模拟了实际生活中的生产过程和消费过程,使得生产者线程可以将数据生产出来...

    VCHOME_多线程综合技术

    - **生产者消费者模型**:使用队列实现数据的生产和消费,线程间通过信号量或条件变量进行通信。 5. **线程调度** - **线程优先级**:不同线程有不同的执行优先级,优先级高的线程更容易被调度。 - **线程调度...

    Muti-thread-win32.rar_c语言多线程_event_多线程C语言

    总的来说,通过这个压缩包,你可以了解到C语言在Windows环境下实现多线程编程的方法,以及如何使用Mutex、Semaphore和Event来实现线程间的同步和通信。这对于提升你的Windows系统级编程能力,尤其是理解和处理并发...

    Python库 | synchronizer_framework-0.0.2-py3-none-any.whl

    4. **事件对象**:事件对象可以用来在不同线程间进行通信,一个线程可以通过设置事件标志来唤醒正在等待的其他线程。库中可能有对`threading.Event`类的扩展或替代实现。 5. **信号量(Semaphore)**:信号量用于...

    Java的多线程-线程间的通信.doc

    在Java多线程编程中,线程间的通信是非常重要的概念,用于协调多个并发执行的任务。线程的状态转换是理解线程通信的基础,主要包括四个状态:新(New)、可执行(Runnable)、死亡(Dead)和停滞(Blocked)。新状态...

    Java 等待唤醒机制

    Java等待唤醒机制是Java多线程编程中一个重要的概念,它涉及到线程间的协作与通信。在Java中,主要通过`Object`类提供的`wait()`、`notify()`和`notifyAll()`方法来实现这一机制。这些方法使得线程可以在特定条件下...

    Java多线程-线程间的通信

    这种机制被称为**等待-唤醒机制**,它是实现线程间通信的核心。 ##### (2)等待唤醒机制 等待唤醒机制是一种用于线程间协作的机制。它允许一个线程等待特定条件发生(通过调用`wait()`方法),并在条件满足时由...

    线程间同步机制 读写锁通信机制 线程与信号

    信号是进程间通信的一种方法,也可以应用于线程间通信。信号可以在任何时候发送到一个进程,被进程中的任何线程捕获。在多线程环境中,处理信号通常需要谨慎,因为默认行为可能会导致数据不一致性。线程可以通过...

    javawork_java_火车票问题_thread_多线程编程_

    - `wait()`, `notify()`和`notifyAll()`方法:用于线程间通信,常配合`synchronized`使用。线程调用`wait()`会释放锁并等待,而其他线程调用`notify()`或`notifyAll()`唤醒等待的线程。 4. **死锁**: - 当两个或...

    C++多线程一步步编程C++多线程一步步编程---多线程

    在C++编程中,多线程技术是一种关键的并发处理机制,它允许程序同时执行多个独立的任务,从而提高系统的效率和响应性。本教程将逐步引导你深入理解并掌握C++中的多线程编程。 首先,我们需要了解C++11及后续标准中...

Global site tag (gtag.js) - Google Analytics