A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

这次弄得是线程间通信的问题。
里面有个什么等待\唤醒机制。哦哦
用东西是有条件的,
必这须得在同步里使用,因为使用到的方法是对线程进行的操作,是锁调用这些方法。
一定要明确是哪个锁的线程。

下面是看完米老爷视频打的代码,期间还出过错,不过总算是调好了
  1. package com.itheima.Thread;
  2. /**
  3. * 线程间间通信演示事例
  4. *
  5. * 多个线程操作相同的资源,但是线程的任务是不同的。
  6. *
  7. * 解决安全问题,线程需要加锁而且需要加通一把锁
  8. * @author DELL
  9. *
  10. * 等待/唤醒机制
  11. * 必须在同步中使用,因为这些方法都是锁的方法,都是用来操作线程状态的。
  12. * 必须要明确是哪个锁
  13. *
  14. */
  15. public class CommnicateDemo {
  16.         public static void main(String[] args) {
  17.                 Resource r = new Resource();//只实例化一个资源,供给多个线程共享
  18.                 new Thread(new Input(r)).start();
  19.                 new Thread(new Output(r)).start();
  20.         }
  21. }


  22. /**
  23. * 多个线程处理的资源
  24. */
  25. class Resource{
  26.         private String name;
  27.         private String sex;
  28.         boolean flag = false;
  29.         public synchronized void set(String name,String sex){
  30.                 if(this.flag){
  31.                         try{
  32.                                 this.wait();
  33.                         }catch(InterruptedException e){
  34.                                 e.printStackTrace();
  35.                         }
  36.                 }
  37.                 this.name= name;
  38.                 this.sex = sex;
  39.                 this.flag = true;//本线程再执行会被冻结
  40.                 this.notify();//唤醒其他线程
  41.         }
  42.         public synchronized void out(){
  43.                 if(!this.flag){
  44.                         try{
  45.                                 this.wait();
  46.                         }catch(InterruptedException e){
  47.                                 e.printStackTrace();
  48.                         }
  49.                 }
  50.                 System.out.println(this.name+"-----------------"+this.sex);
  51.                 this.flag = false;
  52.                 this.notify();
  53.         }
  54.        
  55.        
  56. }

  57. /**
  58. * 负责写入信息的线程
  59. * @author DELL
  60. *
  61. */
  62. class Input implements Runnable{
  63.         private Resource r;
  64.         Input(Resource r){//传入线程共用资源
  65.                 this.r = r;
  66.         }
  67.         public void run(){
  68.                 int x = 0;
  69.                 while(true){
  70.                         synchronized(r){
  71.                                 if(x % 2 == 0){
  72.                                         this.r.set("zhansan","nan");
  73.                                 }else{
  74.                                         this.r.set("丽丽","女女女女女女呢");
  75.                                 }
  76.                         }
  77.                         x++;
  78.                 }
  79.         }
  80. }

  81. /**
  82. * 负责打印信息的线程
  83. * @author DELL
  84. *
  85. */
  86. class Output implements Runnable{
  87.         private Resource r;
  88.         Output(Resource r){
  89.                 this.r = r;
  90.         }
  91.         public void run(){
  92.                 while(true){
  93.                         this.r.out();
  94.                 }
  95.         }
  96. }
复制代码

不容易呀,大家觉得多线程这东东要怎么学啊。什么项目里会用到多线程啊,不知道要在哪里使用。

1 个回复

倒序浏览
我觉的这多线程就像个厕所,用到公用的内容的时候就用到它
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马