http://www.matrix.org.cn/resource/article/2003-06-25/129.html
线程基础---wait(),notify的应用一例
作者:jdeveloper
本例子实现了两个线程,每个线程输出1到100的数字。
第一个线程输出1-10,停止,通知第二个线程 输出1-10 第二个线程停止 通知第一个线程 输出11-20 ...
实现的要点是在Java中,每个对象都有个对象锁标志(Object lock flag)与之想关联,当一个线程A调用对象的一段synchronized代码时,
它首先要获取与这个对象关联的对象锁标志,然后执行相应的代码,执行结束后,把这个对象锁标志返回给对象;因此,在线程A执行
synchronized代码期间,如果另一个线程B也要执行同一对象的一段synchronized代码时(不一定与线程A执行的相同),它将
要等到线程A执行完后,才能继续....
如何利用wait() notify() notifyAll()?
在synchronized代码被执行期间,线程可以调用对象的wait()方法,释放对象锁标志,进入等待状态,并且可以调用notify()或者
notifyAll()方法通知正在等待的其他线程。notify()通知等待队列中的第一个线程,notifyAll()通知的是等待队列中的所有线程。
package jdeveloper.study;
/**
* Title: Jdeveloper's Java Projdect
* Description: n/a
* Copyright: Copyright (c) 2001
* Company: soho http://www.ChinaJavaWorld.com
* @author jdeveloper@21cn.com
* @version 1.0
*/
import java.lang.Runnable;
import java.lang.Thread;
public class DemoThread implements Runnable{
public DemoThread() {
TestThread testthread1 = new TestThread(this,"1");
TestThread testthread2 = new TestThread(this,"2");
testthread2.start();
testthread1.start();
}
public static void main(String[] args) {
DemoThread demoThread1 = new DemoThread();
}
public void run(){
TestThread t = (TestThread) Thread.currentThread();
try{
if (!t.getName().equalsIgnoreCase("1")) {
synchronized(this) {
wait();
}
}
while(true){
System.out.println("@time in thread"+ t.getName()+ "="+ t.increaseTime());
if(t.getTime()%10 == 0) {
synchronized(this) {
System.out.println("****************************************");
notify();
if ( t.getTime()==100 ) break;
wait();
}
}
}
}catch(Exception e){e.printStackTrace();}
}
}
class TestThread extends Thread{
private int time = 0 ;
public TestThread(Runnable r,String name){
super(r,name);
}
public int getTime(){
return time;
}
public int increaseTime (){
return ++time;
}
}
分享到:
相关推荐
4. **同步机制**:为避免线程间的竞态条件和死锁,Java提供了多种同步机制,如`synchronized`关键字、`Lock`接口(如`ReentrantLock`)以及`wait()`, `notify()`, `notifyAll()`方法。它们用于控制对共享资源的访问...
Java提供了多种机制,如`wait()`, `notify()`, 和 `notifyAll()`方法,这些方法在`Object`类中定义,用于控制线程的执行顺序和同步。此外,`synchronized`关键字用于控制对共享资源的访问,避免竞态条件和数据不一致...
- **Runnable接口**:另一种创建线程的方式是实现`Runnable`接口,并将其实例传递给`Thread`构造函数。 - **线程生命周期**:线程的状态包括新建、就绪、运行、阻塞和死亡等阶段。 - **线程命名**:可以通过设置线程...
了解多线程编程,还需要理解线程的生命周期、同步机制(如synchronized关键字和Lock接口)、线程间通信(wait(), notify(), notifyAll()方法)以及线程调度策略等核心概念。此外,异常处理、线程安全问题和死锁也是...
- **主线程**: 每个Java应用程序都从`main()`方法开始执行,此方法运行在一个称为主线程的线程内。 - **调用栈**: 每个线程都有自己的调用栈,即使没有明确创建线程,也会有后台线程运行。 - **用户线程与守护线程**...
在本实验报告中,我们探讨了Java多线程技术在实际编程中的应用,特别是通过编写applet程序展示了如何实现滚动字符串和动态动画效果。实验主要分为两个部分:滚动字符串和蓝色反弹球。以下是对这些知识点的详细说明:...
- **wait(), notify() 和 notifyAll()**:这些方法在处理线程间通信时使用,允许一个线程等待另一个线程的特定条件。 5. **设计模式**: - **观察者模式(Observer Pattern)**:在滚动文字示例中,可能需要一个...
本示例以Java语言为例,通过创建和管理线程,展示了如何在实际应用中实现多线程处理。 在Java中,线程有两种主要的创建方式:继承`Thread`类或者实现`Runnable`接口。标题和描述中提到的“应用Thread进行多线程处理...
其中,`wait()`, `notify()`, `notifyAll()`是基于对象监视器的通信方式,用于在线程间传递信号。`BlockingQueue`则提供了先进先出(FIFO)的线程同步和通信,常用于生产者-消费者模型。 7. **死锁** 死锁是两个或...
- **wait()、notify()与notifyAll()**:在同步控制下,线程之间可以通过这三个方法进行通信,唤醒等待的线程或让当前线程等待。 - **Condition接口**:ReentrantLock中的条件对象,可以创建多个条件变量,实现更...
- `wait()`, `notify()`, `notifyAll()`方法:这些是`Object`类的方法,用于线程间的通信和同步。在同步块中使用它们,可以实现线程的等待和唤醒。 - `volatile`关键字:确保对变量的修改对所有线程可见,避免出现...
1. 等待/通知(wait()和notify()):用于线程间的协作,一个线程等待另一个线程的通知后再继续执行。 2. 线程同步:使用synchronized关键字实现,防止多个线程同时访问同一块代码,避免数据不一致。 3. 守护线程...
在"JAVA100例之实例64 JAVA线程间通讯"的示例中,可能包含了上述一种或多种技术的实践应用。通过实际代码示例,我们可以更好地理解这些方法如何在实际场景中协调多线程的工作。学习和掌握这些通信机制对于编写高效、...
条件变量(condition_variable)允许线程等待特定条件满足后再继续执行,`wait()`函数用于挂起线程,`notify_one()`或`notify_all()`唤醒等待的线程。 此外,`boost::future`是Boost库中的一个高级特性,用于异步...
线程调用`wait()`会释放锁并等待,而其他线程调用`notify()`或`notifyAll()`唤醒等待的线程。 4. **死锁**: - 当两个或更多线程相互等待对方释放资源,导致所有线程都无法继续执行,就会发生死锁。设计线程交互时...
在本例中,可能需要线程1通过`notify()`唤醒线程2,告诉其数组已更新,而线程2则需要在`wait()`状态下,等待线程1的通知。此外,`join()`方法也可以用来确保线程1执行完毕后再执行线程2。 5. **异常处理**:多线程...
学习如何创建和管理线程,理解同步机制(如synchronized关键字、wait()和notify()方法)对于编写高性能的Java应用至关重要。 7. **Swing和AWT**:作为Java的图形用户界面(GUI)工具包,Swing和AWT提供了许多组件...
- **wait(), notify() 和 notifyAll()**:这些方法位于Object类中,用于线程间通信,但必须在同步环境中使用。 **线程优先级**: Java线程有10个优先级,从MIN_PRIORITY(1)到MAX_PRIORITY(10),默认优先级是NORM_...
此外,线程间的通信可以通过wait()、notify()和notifyAll()方法实现,这些方法需要在synchronized上下文中使用。例如,一个线程可能需要等待另一个线程完成某项工作后才能继续,这时就可以使用这些方法进行协调。 ...