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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 Kevin.Kang 于 2015-8-5 15:03 编辑

针对同一资源有不同的线程进行操作
例如:卖票,需要有卖票的进程,还需要有生产票的进程
          通过对学生信息的设置和获取,写一个简单的线程间通信案例

测试类:StudentDemo
  1. package com.kxg_13;
  2. /*
  3. * 资源类:Student
  4. * 设置学生信息:SetThread
  5. * 获取学生信息:GetThread
  6. * 测试类:StudentDemo
  7. *
  8. * 注意:
  9. *                 设置和获取线程使用的资源应该是同一个,所以把这个资源在外界创建出来,通过构造方法传递给其他类。
  10. *
  11. */
  12. public class StudentDemo {
  13.         public static void main(String[] args) {
  14. //                创建资源
  15.                 Student s = new Student();

  16. //                创建Set和Get对象
  17.                 SetThread st = new SetThread(s);
  18.                 GetThread gt = new GetThread(s);

  19. //                创建线程
  20.                 Thread t1 = new Thread(st);
  21.                 Thread t2 = new Thread(gt);

  22. //                开启线程
  23.                 t1.start();
  24.                 t2.start();
  25.         }
  26. }
复制代码
资源类:Student
  1. package com.kxg_13;
  2. /*
  3. * 定义学生类
  4. */
  5. public class Student {
  6.         String name;
  7.         int age;
  8. }
复制代码
设置学生信息:SetThread
  1. package com.kxg_13;

  2. /*
  3. * 设置学生信息的线程
  4. */
  5. public class SetThread implements Runnable {

  6.         private Student s;

  7.         public SetThread(Student s) {
  8.                 this.s = s;
  9.         }
  10.         @Override
  11.         public void run() {
  12.                 s.name = "小明";
  13.                 s.age = 5;
  14.         }
  15. }
复制代码
获取学生信息:GetThread
  1. package com.kxg_13;

  2. /*
  3. * 设置获取学生信息的线程
  4. */
  5. public class GetThread implements Runnable {

  6.         private Student s;

  7.         public GetThread(Student s) {
  8.                 this.s = s;
  9.         }
  10.         @Override
  11.         public void run() {
  12.                 System.out.println(s.name + ":" + s.age);
  13.         }
  14. }
复制代码



1 个回复

倒序浏览
最终版:
测试类:
  1. package com.kxg_03;
  2. public class StudentDemo {
  3.         public static void main(String[] args) {
  4.                 // 创建资源
  5.                 Student s = new Student();

  6.                 // 创建SetThread和GetThread对象
  7.                 SetThread st = new SetThread(s);
  8.                 GetThread gt = new GetThread(s);

  9.                 // 创建线程
  10.                 Thread t1 = new Thread(st);
  11.                 Thread t2 = new Thread(gt);

  12.                 // 开启线程
  13.                 t1.start();
  14.                 t2.start();
  15.         }
  16. }
复制代码
资源类:
  1. package com.kxg_03;
  2. /*
  3. * 定义学生类
  4. */
  5. public class Student {
  6.         String name;
  7.         int age;
  8.         boolean flag;// 用来判断是否存在资源,默认是flash,没有资源

  9.         public synchronized void set(String name, int age) {
  10.                 // 生产者,如果有数据就等待
  11.                 if (!this.flag) {
  12.                         try {
  13.                                 this.wait();
  14.                         } catch (InterruptedException e) {
  15.                                 e.printStackTrace();
  16.                         }
  17.                 }
  18.                 // 设置数据
  19.                 this.name = name;
  20.                 this.age = age;
  21.                 // 修改标记
  22.                 this.flag = false;
  23.                 // 唤醒线程
  24.                 this.notify();
  25.         }

  26.         public synchronized void get() {
  27.                 if (this.flag) {
  28.                         try {
  29.                                 this.wait();
  30.                         } catch (InterruptedException e) {
  31.                                 e.printStackTrace();
  32.                         }
  33.                 }
  34.                 System.out.println(this.name + ":" + this.age);
  35.                 // 修改标记
  36.                 this.flag = true;
  37.                 // 唤醒线程
  38.                 this.notify();
  39.         }
  40. }
复制代码
设置类:
  1. package com.kxg_03;

  2. /*
  3. * 设置学生信息的线程
  4. */
  5. public class SetThread implements Runnable {

  6.         private Student s;
  7.         private int i;

  8.         public SetThread(Student s) {
  9.                 this.s = s;
  10.         }
  11.         @Override
  12.         public void run() {
  13.                 while (true) {
  14.                         if (i % 2 == 0) {
  15.                                 s.set("小明", 5);
  16.                         } else {
  17.                                 s.set("汪汪", 2);
  18.                         }
  19.                         i++;
  20.                 }
  21.         }
  22. }
复制代码
获取类:
  1. package com.kxg_03;

  2. /*
  3. * 设置获取学生信息的线程
  4. */
  5. public class GetThread implements Runnable {

  6.         private Student s;

  7.         public GetThread(Student s) {
  8.                 this.s = s;
  9.         }
  10.         @Override
  11.         public void run() {
  12.                 while (true) {
  13.                         s.get();
  14.                 }
  15.         }
  16. }
复制代码



回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马