`
lighter
  • 浏览: 500970 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

线程间通信一小例学习

阅读更多
wait:告诉线程放弃监视器并进入睡眠状态,直到其他线程进入同一监视器并调用notify为止
notify:唤醒同一对象监视器中调用wait的第一个线程,用于类似饭馆有一个空位后通知所有等候就餐顾客中的第一位可以入座的情况.
notifyAll:唤醒同一对象监视器中调用wait的所有线程,具有最高优先级的线程首先被唤醒并执行.

看下面的步骤:
Thread t --> synchronized(o)--->o.wait()--->o.notify
1、新建一个线程t
2、线程t得到对象o的lock旗标
3、此时线程t被放置在对象o的等待线程池中,t自动释放o的锁旗标
4、当另外的线程执行了对象o的notify()方法后,线程t可能会被从o的等待线程池中释放出来,并且移动到等待线程对象o的锁旗标的线程池中,当t得到锁旗标时就会执行下去

下面是一个经典的消费者-生产者的线程间访问的代码举例

生产者的类如下:
class Producer implements Runnable
{
  Q q;
  public Producer(Q q)
  {
    this.q = q;
  }
  public void run()
   {
    int i = 0;
    while(true)
     {
       if(i == 0 )  
              q.put("zhangsan","male");
       else 
              q.put("lisi","female");
       i = (i+1)%2;
     }
   }
}


消费者的类如下:
class Consumer implements Runnable
{
  Q q;
  public Consumer(Q q)
  {
    this.q = q;
  }
  public void run()
   {
      while(true)
     { 
      q.get();
     }
   }
}


下面是用户信息的类,最经典的用法,各类有各类应该的职责,put()与get()方法写得很不错,值得学习
class Q 
{ 
  private String name="unknown";
  private String sex = "unknown";
  private boolean bFull = false;
  public synchronized void put(String name,String sex)
  {
    if(bFull)  
           try{wait();} catch(Exception e){}
    this.name = name;
    try{Thread.sleep(1);} catch(Exception e){}
    this.sex = sex;
    bFull = true;
    notify();
  }
  public synchronized void get()
  {
        if(!bFull)
                try{ wait(); }catch(Exception e){}
        System.out.print(name);
        System.out.println(":" +sex); 
        bFull = false;
        notify();
  }
}


简单的运行类如下:
public class ThreadCommuncation
{
   public static void main(String[] args)
   {
      Q q = new Q();
     new Thread(new Producer(q)).start();
     new Thread(new Consumer(q)).start();
   }
}


注明:文中所有的代码均为[张孝祥JAVA视频教程中的代码,并非我本人所写,我记录下来,只是复习一下线程间的一些关键点的地方.
分享到:
评论
5 楼 lighter 2007-06-25  
使用wait()方法的时候,有可能抛出异常,在java里必须强制你要捕捉可能出现的异常(其实有两种异常的)
4 楼 xombat 2007-06-25  
if(bFull)        
     wait();  

抱歉这个理解错误,
为了防止因为抛出异常而产生的操作中断,是这样吧。
3 楼 xombat 2007-06-24  
排版弄乱了,抱歉将就看吧
2 楼 xombat 2007-06-24  
呵呵,把博客当成笔记本用了--同时也分享了知识。
我用c实现过生产者和消费者模型,涉及到互斥量,多线程的那些东东。
认真看了看你的代码,感觉就是两个线程操作一块共享区域,无所谓通信吧,通信是对于进程来说的。
    if(bFull)     
           [color=red]try{wait();} catch(Exception e){} [/color]

对这块代码有点不解,为什么不直接这样写呢?
    if(bFull)     
         wait(); 


java不怎么懂,语言不是隔阂,期望讨论。
1 楼 lighter 2007-06-21  
http://blog.hry.cn/article.asp?id=998
java多线程同步设计wait/notify机制
这一篇文章也挺不错的

相关推荐

    VC多线程例程七及图解文档(线程间通信)

    本文将深入探讨“VC多线程例程七”,重点介绍线程间通信这一关键概念,并结合源码分析,以MultiThread7项目为例进行详细讲解。 线程是操作系统分配CPU时间的基本单位,一个进程中可以有多个线程并行运行。在VC++中...

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

    在Java编程中,线程间通信是多线程编程中的一个重要概念。当多个线程并发执行时,有时需要在线程间传递数据或者同步执行顺序,这就涉及到线程间通信。在"JAVA100例之实例64 JAVA线程间通讯"这个主题中,我们将深入...

    vc线程通信实现计时器

    4. **管道通信**:虽然在多数情况下并不常用,但在需要更复杂的数据结构交换时,可以使用命名管道或匿名管道进行线程间通信。 5. **条件变量**:在C++标准库中,`std::condition_variable`提供了一种等待条件满足的...

    C# 如何挂起线程、休眠线程和终止线程(源码例)

    - **条件变量(Conditional Variables)**:允许线程在满足特定条件时继续执行,常用于线程间通信。 在压缩包中的D008文件,很可能是包含一个示例代码,演示了上述线程操作的实际应用。你可以打开这个文件,查看并...

    MFC多线程编程10例

    - 可选地,重写`CWinThread::Run`和`CWinThread::PostThreadMessage`以处理特定的任务和线程间通信。 - 在CWinApp派生类的`InitInstance`中启动线程,通过`AfxBeginThread`函数创建并启动新线程。 在MFC中,线程...

    多线程编程10例源码

    3. **线程通信**:线程间通信(IPC)允许线程交换信息。Windows API的`WaitForSingleObject`和`WaitForMultipleObjects`函数可用于等待特定对象的状态变化,如线程完成或事件触发。 4. **线程优先级**:每个线程都...

    UNIX网络编程 第2卷 进程间通信.pdf(带书签)

    《UNIX网络编程 第2卷 进程间通信》是一本深入探讨UNIX环境下进程间通信机制的权威技术书籍。该书共分为四部分,涵盖了从基础套接口编程到高级套接口编程的多个方面,旨在为读者提供全面的进程间通信知识和编程实践...

    多线程实例,线程实例

    - 线程间通信:线程间通信复杂,可能需要使用信号量、互斥锁等同步机制。 三、多线程实现 在不同的编程语言中,多线程的实现方式各有差异。以Java为例,可以通过以下两种方式创建线程: 1. 继承Thread类:创建一...

    安卓线程间函数调用和保存数值

    ### 安卓线程间函数调用和保存数值 ...通过上述示例代码,我们不仅了解了如何实现线程间的通信,还学习了如何使用`SharedPreferences`来保存应用的状态信息。这些都是Android开发中非常实用的技术点。

    JAVA实现线程间同步与互斥生产者消费者问题

    2. **wait()和notify()方法**:这些方法位于`Object`类中,可以用于线程间的通信。当一个线程调用`wait()`时,它会释放对象锁并进入等待状态,直到其他线程调用该对象的`notify()`或`notifyAll()`方法将其唤醒。在这...

    通过线程控制随机数产生与结束

    3. 使用`Handler`、`Looper`和`Message`进行线程间通信。 4. 线程同步与控制:`Semaphore`或其他同步工具的使用。 5. 随机数生成:`Random`类的使用。 6. 循环控制逻辑:根据条件判断是否终止循环。 通过对这个Demo...

    Demo_多线程例_

    在实践中,务必注意线程间的交互和通信,避免死锁、饥饿等问题。对于.NET 2.0环境下的项目,虽然有些高级特性如`async/await`不可用,但依然可以通过其他方式实现异步处理,比如回调函数和事件。

    MFC多线程详例

    线程间的通信也是MFC多线程中的重要环节。MFC提供了消息队列和消息映射机制,使得线程间可以通过发送消息来交换数据或触发事件。例如,一个线程可以发送一个WM_USER定义的消息到主线程,主线程通过OnMessage()函数...

    一个简单的线程例子

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

    易语言线程通信源码-易语言

    2. **数据共享**:线程间通信的核心是数据交换,代码中可能会定义全局变量或者使用特定的结构体来存储共享数据,并使用“设置内存”等命令进行数据的读写。 3. **同步机制**:为了保证数据的一致性,源码中会运用到...

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

    8. **线程间的通信**:Java的`BlockingQueue`接口和其实现(如`ArrayBlockingQueue`、`LinkedBlockingQueue`)可以方便地实现线程间的同步和通信,它们是生产者-消费者模型的典型应用。 综上所述,本示例可能通过...

    QT多线程小例子.zip

    此外,线程间的通信需要谨慎处理,避免阻塞和死锁的发生。 QT5还引入了QtConcurrent库,提供了一组方便的函数,如run()、mapped()等,可以简化并行计算的任务,无需直接处理线程细节。这些函数会自动在合适的线程池...

    罗宾500例-第9章 进程与线程.rar

    《罗宾500例-第9章 进程与线程》是一个专门针对进程和线程主题的资源集合,适合MFC(Microsoft Foundation Classes)框架的学习者进行深入研究。在计算机科学中,进程和线程是操作系统核心概念,它们在多任务环境中...

    VC++创建多线程以及应用

    临界区和互斥量用于保护对共享资源的独占访问,事件和信号量用于线程间的通信和协调,读写锁则允许多个读线程并发访问,但只允许一个写线程。 以下压缩包中的文件名称列表可能是各种示例代码,包括了不同线程操作的...

Global site tag (gtag.js) - Google Analytics