Thread学习(三)多个线程访问共享对象和数据的方式

墨蓝 2022-07-15 12:08 141阅读 0赞

1.如果每个线程执行的代码相同,可以使用同一个Runable对象,这个Runable对象中有那个共享数据,例如卖票系统就可以这样做。

2.如果每个线程执行的代码不相同,这个时候需要用到不同的Runable对象,有如下两种方式实现多个Runable对象中的数据共享。

(1)将共享数据封装在另一个对象中,然后将这对象逐一传递给各个Runable对象,每个线程对共享数据的操作方法也交给那个对象去进行,这样就能实现多个线程之间的互斥和通信。

  1. public class SomeThreadTest2 {
  2. public static void main(String[] args) {
  3. A a = new A();
  4. new Thread(new C(a)).start();//创建第一个线程
  5. new Thread(new D(a)).start();//创建第二个线程
  6. }
  7. }
  8. class C implements Runnable{ //创建第一个Runable对象
  9. private A a;
  10. public C(A a) {
  11. this.a=a;
  12. }
  13. @Override
  14. public void run() {
  15. System.out.println(a.Add());;
  16. }
  17. }
  18. class D implements Runnable{ //创建第二个Runable对象
  19. private A a;
  20. public D(A a) {
  21. this.a=a;
  22. }
  23. @Override
  24. public void run() {
  25. System.out.println(a.Reduce());;
  26. }
  27. }
  28. /**
  29. * C和D执行的代码不相同,这个时候需要用到不同的Runable对象
  30. *
  31. * A
  32. * 创建人:LiBoMing
  33. * 时间:2016年11月16日-上午10:20:08
  34. * @version 1.0.0
  35. *
  36. */
  37. class A {//存储共享数据的对象
  38. private Integer integer = 50;
  39. public synchronized Integer Reduce() { //操作共享数据的方法
  40. return --integer;
  41. }
  42. public synchronized Integer Add() { //操作共享数据的方法
  43. return ++integer;
  44. }
  45. }

上面这个例子中A类中的integer是两个线程想要操作的共享数据,而两个线程要对共享数据执行的操作方法还是不同的,此时就需要两个Runable对象,这样就实现了Integer这个共享数据在多个线程中互斥和通信!!

(2)讲这些个Runable对象作为某一个类中的内部类,共享数据作为这个外部类中的成员变量,每个线程对共享数据的操作也作为这个外部类的方法,这些歌Runable对象分别取调用这个外部类的不同操作共享数据的方法,样就实现了这个共享数据在多个线程中互斥和通信!!

  1. package com.lbm.Test;
  2. public class SomeThreadTest {
  3. public static void main(String[] args) {
  4. A count = new A();
  5. /**
  6. * 创建两个线程内部类,并且两个Runable对共享数据所做的操作不同
  7. */
  8. new Thread(new Runnable() {//创建一个线程内部类
  9. @Override
  10. public void run() {
  11. System.out.println(count.Reduce());
  12. }
  13. }).start();
  14. new Thread(new Runnable() {//创建第二个线程内部类
  15. @Override
  16. public void run() {
  17. System.out.println(count.Add());
  18. }
  19. }).start();
  20. }
  21. }
  22. class A {
  23. private Integer integer = 50;//共享数据
  24. public synchronized Integer Reduce() {//对共享数据的操作方法(此处的synchronize是为了保证线程安全)
  25. return --integer;
  26. }
  27. public synchronized Integer Add() {//对共享数据的操作方法
  28. return ++integer;
  29. }
  30. }

总之要同步几段互斥的代码最好是放在不同的方法中,这些方法再放在同一个类中,这样比较容易实现他们之间的互斥和通信!

发表评论

表情:
评论列表 (有 0 条评论,141人围观)

还没有评论,来说两句吧...

相关阅读