`
xiaobian
  • 浏览: 588172 次
  • 来自: 北京
社区版块
存档分类
最新评论

线程基础---wait(),notify的应用一例

阅读更多
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;
    }


}
分享到:
评论

相关推荐

    427.425.JAVA基础教程_多线程-每天一考(427).rar

    4. **同步机制**:为避免线程间的竞态条件和死锁,Java提供了多种同步机制,如`synchronized`关键字、`Lock`接口(如`ReentrantLock`)以及`wait()`, `notify()`, `notifyAll()`方法。它们用于控制对共享资源的访问...

    彻底明白Java的多线程-线程间的通信.doc

    Java提供了多种机制,如`wait()`, `notify()`, 和 `notifyAll()`方法,这些方法在`Object`类中定义,用于控制线程的执行顺序和同步。此外,`synchronized`关键字用于控制对共享资源的访问,避免竞态条件和数据不一致...

    illy-Java.Threads.2nd.Edition

    - **Runnable接口**:另一种创建线程的方式是实现`Runnable`接口,并将其实例传递给`Thread`构造函数。 - **线程生命周期**:线程的状态包括新建、就绪、运行、阻塞和死亡等阶段。 - **线程命名**:可以通过设置线程...

    java多线程基础篇讲解

    了解多线程编程,还需要理解线程的生命周期、同步机制(如synchronized关键字和Lock接口)、线程间通信(wait(), notify(), notifyAll()方法)以及线程调度策略等核心概念。此外,异常处理、线程安全问题和死锁也是...

    java多线程编程教程

    - **主线程**: 每个Java应用程序都从`main()`方法开始执行,此方法运行在一个称为主线程的线程内。 - **调用栈**: 每个线程都有自己的调用栈,即使没有明确创建线程,也会有后台线程运行。 - **用户线程与守护线程**...

    JAVA多线程实验报告

    在本实验报告中,我们探讨了Java多线程技术在实际编程中的应用,特别是通过编写applet程序展示了如何实现滚动字符串和动态动画效果。实验主要分为两个部分:滚动字符串和蓝色反弹球。以下是对这些知识点的详细说明:...

    设计滚动字演示线程状态及改变方法

    - **wait(), notify() 和 notifyAll()**:这些方法在处理线程间通信时使用,允许一个线程等待另一个线程的特定条件。 5. **设计模式**: - **观察者模式(Observer Pattern)**:在滚动文字示例中,可能需要一个...

    应用线程处理,经典小例子。可运行。

    本示例以Java语言为例,通过创建和管理线程,展示了如何在实际应用中实现多线程处理。 在Java中,线程有两种主要的创建方式:继承`Thread`类或者实现`Runnable`接口。标题和描述中提到的“应用Thread进行多线程处理...

    java多线程代码案例(创建线程,主线程,线程优先级,线程组,线程同步,线程间的通信)

    其中,`wait()`, `notify()`, `notifyAll()`是基于对象监视器的通信方式,用于在线程间传递信号。`BlockingQueue`则提供了先进先出(FIFO)的线程同步和通信,常用于生产者-消费者模型。 7. **死锁** 死锁是两个或...

    Java多线程编程实例全书随书代码.rar

    - **wait()、notify()与notifyAll()**:在同步控制下,线程之间可以通过这三个方法进行通信,唤醒等待的线程或让当前线程等待。 - **Condition接口**:ReentrantLock中的条件对象,可以创建多个条件变量,实现更...

    《Java多线程编程实例》随书源码

    - `wait()`, `notify()`, `notifyAll()`方法:这些是`Object`类的方法,用于线程间的通信和同步。在同步块中使用它们,可以实现线程的等待和唤醒。 - `volatile`关键字:确保对变量的修改对所有线程可见,避免出现...

    多线程实例,线程实例

    1. 等待/通知(wait()和notify()):用于线程间的协作,一个线程等待另一个线程的通知后再继续执行。 2. 线程同步:使用synchronized关键字实现,防止多个线程同时访问同一块代码,避免数据不一致。 3. 守护线程...

    JAVA100例之实例64 JAVA线程间通讯

    在"JAVA100例之实例64 JAVA线程间通讯"的示例中,可能包含了上述一种或多种技术的实践应用。通过实际代码示例,我们可以更好地理解这些方法如何在实际场景中协调多线程的工作。学习和掌握这些通信机制对于编写高效、...

    boost 线程库的应用例子, 罗大侠的书本配例,基于1.52

    条件变量(condition_variable)允许线程等待特定条件满足后再继续执行,`wait()`函数用于挂起线程,`notify_one()`或`notify_all()`唤醒等待的线程。 此外,`boost::future`是Boost库中的一个高级特性,用于异步...

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

    线程调用`wait()`会释放锁并等待,而其他线程调用`notify()`或`notifyAll()`唤醒等待的线程。 4. **死锁**: - 当两个或更多线程相互等待对方释放资源,导致所有线程都无法继续执行,就会发生死锁。设计线程交互时...

    创建、增长并读取线程

    在本例中,可能需要线程1通过`notify()`唤醒线程2,告诉其数组已更新,而线程2则需要在`wait()`状态下,等待线程1的通知。此外,`join()`方法也可以用来确保线程1执行完毕后再执行线程2。 5. **异常处理**:多线程...

    JAVA2应用编程150例1-4

    学习如何创建和管理线程,理解同步机制(如synchronized关键字、wait()和notify()方法)对于编写高性能的Java应用至关重要。 7. **Swing和AWT**:作为Java的图形用户界面(GUI)工具包,Swing和AWT提供了许多组件...

    JAVA100例之实例62JAVA多线程

    - **wait(), notify() 和 notifyAll()**:这些方法位于Object类中,用于线程间通信,但必须在同步环境中使用。 **线程优先级**: Java线程有10个优先级,从MIN_PRIORITY(1)到MAX_PRIORITY(10),默认优先级是NORM_...

    一个简单的线程例子

    此外,线程间的通信可以通过wait()、notify()和notifyAll()方法实现,这些方法需要在synchronized上下文中使用。例如,一个线程可能需要等待另一个线程完成某项工作后才能继续,这时就可以使用这些方法进行协调。 ...

Global site tag (gtag.js) - Google Analytics