- 浏览: 77390 次
- 性别:
- 来自: 深圳
文章分类
最新评论
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();*/ } }
发表评论
-
151多线程(优先级&yield方法)
2015-10-28 11:16 694/* 养成习惯:数据共享用静态 */ class Dem ... -
150_多线程(Join方法)
2015-10-27 18:31 610/* join: 当A线程执行到了B线程的join方法 ... -
114_面向对象(多异常处理)_黑马程序员_Java基础视频
2015-10-25 23:27 695/* 对多异常的处理 1.生命异常时,建议声明更为具体的异 ... -
113_面向对象(异常声明throws)_黑马程序员_Java基础视频
2015-10-25 23:26 481/* 异常:就是程序在运行时出现不正常情况 异常由来:问题 ... -
112_面向对象(异常try-catch)
2015-10-25 23:25 733/* 异常:就是程序在运行时出现不正常情况 异常由来:问题 ... -
148_多线程(停止线程)
2015-10-25 23:16 580/* stop方法已经过时。 如何停止线程? 只有一 ... -
147_多线程(线程间通信-生产者消费者JDK5.0升级版)
2015-10-21 23:33 749/*JDK1.5及以上提供了多线程升级解决方案。 将同步Sy ... -
146_多线程(线程间通信-生产者消费者)
2015-10-20 23:35 626一个生产者一个消费者 ... -
142_多线程-线程间通信
2015-10-20 16:18 702/* 线程间通讯: 其实就是多线程在操作同一个资源。 但 ... -
141多线程-死锁
2015-10-20 14:45 693/* 死锁: 同步中嵌套同步 */ class T ... -
140_多线程(多线程-单例设计模式-懒汉式)
2015-10-19 11:45 688/* 单例设计模式 饿汉式 class Single ... -
138_多线程(多线程-同步函数的锁是this)
2015-10-15 14:48 847/* 同步函数用的是哪一个锁呢? 函数需要被对象调用。那么 ... -
137_多线程(多线程-同步函数)
2015-10-13 23:25 599/* 需求:银行有一个金库。 有两个储户分别存300元 ... -
135_多线程(多线程的安全问题)
2015-10-13 18:07 609class TWindow implements Runnab ... -
多线程(创建线程-实现Runnable接口)
2015-10-10 00:19 554class TWindow implements Runnab ... -
133_多线程(售票的例子)
2015-10-09 23:48 645/* 需求:简单的买票程序 多个窗口卖票 */ c ... -
132_多线程(获取线程对象以及名称)
2015-10-09 23:30 1216/* 练习:创建两个线程,和主线程交替运行 线程都有自 ... -
多线程-继承Thread类
2015-10-09 00:26 1560/* 进程:是一个正在执行中的程序 每一个进程执行都有一个 ... -
包的应用
2015-10-08 23:28 1665package pack; class PackageD ... -
异常总结
2015-10-05 20:07 574异常是什么? 是对问题的描述,将问题进行对象的封装。 ...
相关推荐
在IT行业中,线程同步通信技术是多线程编程中的核心概念,特别是在高并发和分布式系统设计中。张孝祥老师的课程"传智播客_张孝祥_传统线程同步通信技术"深入浅出地讲解了这一主题,旨在帮助开发者理解和掌握线程间的...
事件对象是Windows API中用于线程间通信的一种同步机制。它可以被设置为有信号状态或无信号状态,线程通过WaitForSingleObject或WaitForMultipleObjects函数等待事件状态的改变。事件对象主要有两种类型:手动重置...
然而,多线程环境下也会带来一系列问题,如数据不一致性、资源竞争等,因此,理解线程安全、线程同步以及等待唤醒机制至关重要。此外,单例设计模式在确保一个类只有一个实例的同时,提供了全局访问点,也是多线程...
- **线程间的通信可以通过共享内存、管道、消息队列、套接字等方式实现。** 6. **线程调度策略**: Linux提供多种线程调度策略,如SCHED_OTHER(默认,轮转),SCHED_FIFO(先入先出,实时),SCHED_RR(时间片...
`pthread_create()`函数用于创建新线程,`pthread_join()`用于等待线程结束,`pthread_mutex_t`用于同步线程,防止数据竞争,`pthread_cond_t`用于线程间的条件等待和唤醒。 其次,服务器端的多线程通信涉及到网络...
- `Channel`:C# 6.0以后引入,用于高效、安全的线程间通信。 7. **线程状态**: - 新建(New):线程刚刚创建,尚未启动。 - 运行(Running):线程正在执行。 - 可运行(Runnable):线程准备好运行,但等待...
等待唤醒机制是Java中通过`wait()`、`notify()`和`notifyAll()`方法实现的一种线程间的通信方式。当一个线程调用`wait()`方法时,它会释放当前持有的锁并进入等待状态,直到其他线程调用`notify()`或`notifyAll()`...
在多线程编程中,线程通信是一个至关...总之,线程通信是多线程编程中的基础,而事件对象是实现线程间通信的一种有效方式。通过学习和实践,你将能够熟练地在你的程序中应用这些技术,提升多线程程序的效率和可靠性。
4. **事件标志组(Event Flags)**:事件标志组允许任务等待一组条件中的一个或多个发生,提高了任务间通信的灵活性。任务可以通过组合不同的标志来决定何时唤醒。 5. **队列(Queues)**:FreeRTOS中的队列用于...
- **事件对象(Event)**:用于线程间的通信和同步,可以实现线程唤醒、等待等操作。 - **临界区(Critical Section)**:轻量级同步机制,用于保护一小段代码区域不被并发访问。 4. **线程通信**: - **消息...
在Java编程中,线程间的通信是多线程编程中的一个重要概念,特别是在处理并发和协作任务时。生产者消费者模型是一种经典的线程同步问题,它模拟了实际生活中的生产过程和消费过程,使得生产者线程可以将数据生产出来...
- **生产者消费者模型**:使用队列实现数据的生产和消费,线程间通过信号量或条件变量进行通信。 5. **线程调度** - **线程优先级**:不同线程有不同的执行优先级,优先级高的线程更容易被调度。 - **线程调度...
总的来说,通过这个压缩包,你可以了解到C语言在Windows环境下实现多线程编程的方法,以及如何使用Mutex、Semaphore和Event来实现线程间的同步和通信。这对于提升你的Windows系统级编程能力,尤其是理解和处理并发...
4. **事件对象**:事件对象可以用来在不同线程间进行通信,一个线程可以通过设置事件标志来唤醒正在等待的其他线程。库中可能有对`threading.Event`类的扩展或替代实现。 5. **信号量(Semaphore)**:信号量用于...
在Java多线程编程中,线程间的通信是非常重要的概念,用于协调多个并发执行的任务。线程的状态转换是理解线程通信的基础,主要包括四个状态:新(New)、可执行(Runnable)、死亡(Dead)和停滞(Blocked)。新状态...
Java等待唤醒机制是Java多线程编程中一个重要的概念,它涉及到线程间的协作与通信。在Java中,主要通过`Object`类提供的`wait()`、`notify()`和`notifyAll()`方法来实现这一机制。这些方法使得线程可以在特定条件下...
这种机制被称为**等待-唤醒机制**,它是实现线程间通信的核心。 ##### (2)等待唤醒机制 等待唤醒机制是一种用于线程间协作的机制。它允许一个线程等待特定条件发生(通过调用`wait()`方法),并在条件满足时由...
信号是进程间通信的一种方法,也可以应用于线程间通信。信号可以在任何时候发送到一个进程,被进程中的任何线程捕获。在多线程环境中,处理信号通常需要谨慎,因为默认行为可能会导致数据不一致性。线程可以通过...
- `wait()`, `notify()`和`notifyAll()`方法:用于线程间通信,常配合`synchronized`使用。线程调用`wait()`会释放锁并等待,而其他线程调用`notify()`或`notifyAll()`唤醒等待的线程。 4. **死锁**: - 当两个或...
在C++编程中,多线程技术是一种关键的并发处理机制,它允许程序同时执行多个独立的任务,从而提高系统的效率和响应性。本教程将逐步引导你深入理解并掌握C++中的多线程编程。 首先,我们需要了解C++11及后续标准中...