面向对象思想是指:万物皆为对象,可以将事物抽象到一个类中,类中有对成员变量访问的方法。
面向对象的多线程编程思想即将多线程编程和面向对象思想相结合,具体来讲如下:

1、多个线程共享一个对象

多个线程难免会调用类中的方法,常用的使用方式即:多个线程共享一个类的一个对象,那么这个类的成员变量实际对于多个线程来说是共享的,因为共享一个对象,当然也共享该对象中的成员变量,因为成员变量和对象是一对一的关系。所以定义类中方法的时候,要考虑到方法是多个线程调用,那就会涉及到多线程读写共享变量的问题,这里的共享变量即为共享对象的成员变量,所以如果想保证线程安全,一定要在方法上加入synchronized(this),表示对调用该方法的对象上加锁,因为多个线程共享一个对象,所以自然可以实现多个线程间对共享成员变量的互斥访问。

2、多线程类中方法的设计思路

如上述所说,涉及访问成员变量的方法要加入synchronized保证互斥访问。除此之外,在设计方法时,要考虑到方法里的代码是被多个线程共用的,所以可以将方法内的代码直接代入到线程的run方法中来设计代码,会更容易些。

面向对象的多线程编程思想例子:

问题描述:三个线程,交替输出abc,一共输出5次。
输出效果:abcabcabcabcabc

  1. public class TestTurnPrint {
  2. public static void main(String[] args) {
  3. WaitNotify wn= new WaitNotify(1,5);//多个线程共享这一份对象
  4. new Thread(()->{
  5. try {
  6. wn.print("a",1,2);
  7. } catch (InterruptedException e) {
  8. e.printStackTrace();
  9. }
  10. }).start();
  11. new Thread(()->{
  12. try {
  13. wn.print("b",2,3);
  14. } catch (InterruptedException e) {
  15. e.printStackTrace();
  16. }
  17. }).start();
  18. new Thread(()->{
  19. try {
  20. wn.print("c",3,1);
  21. } catch (InterruptedException e) {
  22. e.printStackTrace();
  23. }
  24. }).start();
  25. }
  26. }
  27. /*
  28. 输出内容 等待标记 下一个标记
  29. a 1 2
  30. b 2 3
  31. c 3 1
  32. */
  33. class WaitNotify{
  34. //等待标记
  35. private int flag;
  36. //循环次数
  37. private int loopNumber;
  38. //构造方法
  39. public WaitNotify(int flag,int loopNumber){
  40. this.flag=flag;
  41. this.loopNumber=loopNumber;
  42. }
  43. //核心方法-打印
  44. public void print(String str,int waitFlag,int nextFlag) throws InterruptedException {
  45. for(int i=0;i<loopNumber;i++){
  46. synchronized (this){
  47. while(flag!=waitFlag){
  48. this.wait();
  49. }
  50. System.out.println(str);
  51. flag=nextFlag;
  52. this.notifyAll();
  53. }
  54. }
  55. }
  56. }