Java 멀티스레드 Thread 클래스와 Runnable 인터페이스 간의 연결 탐색

34995 단어 Runnable
먼저 자바 다중 루틴 실현 메커니즘을 복습해 보자. 자바 다중 루틴 실현 방법은 다음과 같은 몇 가지가 있다.
1, 계승 (extends)Thread 클래스
2, 구현(implements)Runnable 인터페이스
즉 다음과 같은 두 가지 상황이 있다
시나리오 1: Thread 클래스를 상속합니다.다시 쓰는 방법run().그리고 new에서 Start () 방법을 호출합니다.
 1 public class TestThread

 2 {

 3     private int i;

 4     public static void main(String[] args)

 5     {

 6         // TODO          

 7         for(int i=0;i<50;i++)

 8         {

 9             System.out.println(Thread.currentThread().getName()+":"+i);

10             if(i==20)

11             {

12                 new newThread_1("thread__1").start();

13             }

14         }

15     }

16 

17 }

18 class newThread_1 extends Thread

19 {

20     public newThread_1(String threadName)

21     {

22         super(threadName);

23     }

24     public void run()

25     {

26         for(int i=0;i<50;i++)

27         {

28             System.out.println(Thread.currentThread().getName()+":"+i);

29         }

30     }

31 }


방법2: Runnable 인터페이스를 실현하고 인터페이스를 실현하는 클래스를 Thread의 구조 매개 변수로 한다.
 1 package com.chenjun.test;

 2 

 3 

 4 public class TestThread

 5 {

 6     /**

 7      * @param args

 8      */

 9     public static void main(String[] args)

10     {

11         // TODO          

12         for(int i=0;i<50;i++)

13         {

14             System.out.println(Thread.currentThread().getName()+":"+i);

15             if(i==20)

16             {

17                 new Thread(new newThread()).start();

18             }

19         }

20     }

21 }

22 

23 class newThread implements Runnable

24 {

25 

26     @Override

27     public void run()

28     {

29         // TODO          

30         for(int i=0;i<50;i++)

31         {

32             System.out.println(Thread.currentThread().getName()+":"+i);

33         }

34     }

35     

36 }

그럼 문제 나왔습니다.도대체 부류 Thread를 계승하는 것이 편리할까요, 아니면 Runnable 인터페이스를 실현하는 것이 좋을까요?모두가 알다시피 자바의 대상을 대상으로 하는 특성에서는 다중 계승을 지원하지 않지만 특정한 종류가 여러 인터페이스를 실현할 수 있도록 허용하는 이 문제의 답은 말하지 않아도 알 수 있다.부류를 계승하지 않을 수 있다면 상속을 최대한 피해야 한다.인터페이스를 실현하는 것은 좋은 프로그래밍 스타일이다
본문에서 기초 지식에 대한 회고는 끝까지 끝난다.다음은 자바SDK의 원본을 읽지 않는 상황에서 노사가 당신을 데리고 JDk의 Thread류와 Runnable가 도대체 신마자 관계인지 추측해 보겠습니다.
먼저: 먼저'주제넘은 말'자바의 디자인 모델인 프록시 모델에 대해 이야기합시다.
1, 무엇이 에이전트 모델입니까?
프록시 모드의 역할은 다른 대상에게 프록시를 제공하여 이 대상에 대한 접근을 제어하는 것이다.
 
2. 전략 모델은 어떤 장점이 있습니까?
어떤 상황에서 한 고객이 다른 대상을 원하지 않거나 직접 인용할 수 없으며 대리 대상은 클라이언트와 목표 대상 사이에 중개 역할을 할 수 있다.
 
3. 프록시 모델이 일반적으로 다루는 역할은 다음과 같다.
 
추상적 역할: 진실 대상과 대리 대상의 공동 인터페이스를 성명한다.프록시 역할: 프록시 대상 역할 내부에 실제 대상에 대한 인용이 포함되어 있어 실제 대상을 조작할 수 있고 프록시 대상은 실제 대상과 같은 인터페이스를 제공하여 언제든지 실제 대상을 대체할 수 있다.또한 프록시 대상은 실제 대상 작업을 수행할 때 다른 조작을 추가할 수 있어 실제 대상을 봉인하는 것과 같다.실제 역할: 대리 역할이 대표하는 실제 대상은 우리가 최종적으로 인용할 대상이다.
 
4, 장면 적용 예:
예를 들어 서문경이 반금련을 찾았는데 그 반금련이 대답하기가 거북하다. 어떡하지? 그 왕할머니를 대리로 찾았는데 절차상 이렇게 나타난다.
먼저 이 장면의 요소를 말하자면 한 가지 유형의 여자, 반금련, 왕할머니, 서문경이다. 나중에 확장된 가씨도 서문경과 결탁했다. 우리는 가설한 것이다. 그리고 서문경은 반금련 해피를 찾았다. 그러나 반금련은 쑥스러우니 직접 왕할머니를 대리하자.구체적인 코드를 봅시다.
 1 package com.yangguangfu.proxy;  

 2 /** 

 3  *  

 4  * @author   ([email protected])<br> 

 5  *         ,                 

 6  */  

 7 public interface KindWoman {  

 8       

 9     //

10     public void makeEyesWithMan();//     

11       

12     public void happyWithMan();//     ....  

13   

14 }  

한 종류잖아. 그건 틀림없이 인터페이스야. 판금련을 정의해.
 1 package com.yangguangfu.proxy;  

 2 /** 

 3  *  

 4  * @author   ([email protected])<br> 

 5  *              

 6  */  

 7 public class PanJinLian  implements KindWoman{  

 8   

 9     @Override  

10     public void happyWithMan() {  

11         System.out.println("          ...");  

12           

13     }  

14   

15     @Override  

16     public void makeEyesWithMan() {  

17         System.out.println("      ...");  

18           

19     }  

20   

21 }  

못생긴 왕할머니를 다시 정의하다
 
 1 package com.yangguangfu.proxy;  

 2 /** 

 3  *  

 4  * @author   ([email protected])<br> 

 5  *         ,    ,         , 

 6  *         ,          ! 

 7  */  

 8 public class WangPo implements KindWoman {  

 9       

10     private KindWoman kindWoman;  

11       

12     public WangPo(){  

13         //             

14         this.kindWoman = new PanJinLian();  

15     }  

16     //    KindWomam          ,          

17     public WangPo(KindWoman kindWoman){  

18         this.kindWoman = kindWoman;  

19     }  

20   

21     @Override  

22     public void happyWithMan() {  

23         //    ,    ,         。  

24         this.kindWoman.happyWithMan();  

25           

26     }  

27   

28     @Override  

29     public void makeEyesWithMan() {  

30         //

31         this.kindWoman.makeEyesWithMan();  

32           

33     }  

34   

35 }  

두 여주인공이 모두 등장했으니, 남자 주인공이 되어서 서문경을 정의해야 한다.
 1 package com.yangguangfu.proxy;  

 2 /** 

 3  *  

 4  * @author   ([email protected])<br> 

 5  *        :              ,       ,      ,         ,                  ,       : 

 6  *           ,           ?    ! 

 7  */  

 8 public class XiMenQiang {  

 9   

10     /** 

11      * @param args 

12      */  

13     public static void main(String[] args) {  

14         WangPo wangPo;  

15         //        

16          wangPo = new WangPo();  

17         //      ,      Happy,                 :  

18         wangPo.makeEyesWithMan();  

19         //

20         wangPo.happyWithMan();  

21           

22           

23   

24     }  

25   

26 }  

이것은 바로 생생한 예이다. 대리인을 통해 어떤 목적을 실현했다. 만약에 왕할머니라는 중간 부분에 가서 서문경과 반금련이 직접 결탁한다면 무송이 형수를 죽인 사건을 이루기 어려울 것이다.
그럼 우리 다시 생각해 보자. 수호지에 이런 유형의 여자가 또 있나?네, 노준의의 아내 가씨(그 집사와 구차하게 어울리는 그)가 있습니다. 이 이름은'가씨'라고 지었습니다. 그러면 우리도 왕할머니를 대리로 하겠습니다.
 1 package com.yangguangfu.proxy;  

 2 /** 

 3  *  

 4  * @author   ([email protected])<br> 

 5  *             

 6  */  

 7 public class JiaShi implements KindWoman {  

 8   

 9     @Override  

10     public void happyWithMan() {  

11         System.out.println("         ...");  

12           

13     }  

14   

15     @Override  

16     public void makeEyesWithMan() {  

17         System.out.println("     ...");  

18           

19     }  

20   

21   

22 }  

이어서 서문경이 판금련을 꼬셔서 가씨를 꼬셨다.
 1 package com.yangguangfu.proxy;  

 2 

 3 public class XiMenQiang {  

 4   

 5     /** 

 6      * @param args 

 7      */  

 8     public static void main(String[] args) {  

 9         WangPo wangPo;  

10         //        

11          wangPo = new WangPo();  

12         //      ,      Happy

13         wangPo.makeEyesWithMan();  

14         //

15         wangPo.happyWithMan();  

16           

17           

18           

19         //         

20         JiaShi jiaShi = new JiaShi();  

21         wangPo = new WangPo(jiaShi);  

22         wangPo.makeEyesWithMan();  

23         wangPo.happyWithMan();  

24   

25     }  

26   

27 }  

이 이야기를 마치면 제가 정리해 보겠습니다. 대리 모델은 주로 자바의 다태를 사용했습니다. 일을 하는 것은 피대리류이고 대리류는 주로 일을 맡습니다. 당신이 저에게 일을 시키면 됩니다. 좋습니다. 저는 막후의 류에 맡깁니다. 마음에 들면 됩니다. 그러면 대리류가 할 수 있는지 없는지 어떻게 알 수 있습니까?같은 뿌리가 되면 모두 내막을 알고 네가 무엇을 할 수 있는지, 내가 무엇을 할 수 있는지 모두 잘 알고 있다. 같은 인터페이스지.됐어, 더 이상 말하지 말고 천천히 체득해라.(주: 이 이야기는 http://yangguangfu.iteye.com/blog/815787 블로그에 전재)
네, 좀 멀어졌어요.우리는 돌아와서 이어서 Runnable과 Thread류의 관계 문제를 토론했다.
이 노랗고 폭력적인 이야기를 듣고 Thread류와 Runnable 인터페이스 사이에 대리 디자인 모델의 모델이 안에 있다고 말하고 싶습니다.믿습니까?   look! 다음 보기:
다음 코드는 제가 아주 상세한 주석을 썼는데, 보고 나면 Thread와 Runnable의 관계에 대해 내막을 알게 될 것입니다.자기가 JDK 코드를 읽는 것보다 낫다.
 1 package com.chenjun.test;

 2 

 3 public class Test

 4 {

 5     /**

 6      * @param args

 7      */

 8     public static void main(String[] args)

 9     {

10         // TODO          

11         Demo1 demo1 = new Demo1();

12         demo1.start();

13         new MyThread(new MyRunnable() {    //    ,           ,        new Thread(new Runnable(){}).start();

14             @Override

15             public void run()

16             {

17                 // TODO          

18                 System.out.println("  Demo is call the run()!!!");

19             }

20         }).start();

21         new MyThread(new Demo2()).start();

22     }

23 }

24 interface MyRunnable

25 {

26     public void run();

27 }

28 class MyThread implements MyRunnable  //   MyThread     ”      MuRunnable    “      (       ! )

29 {

30     private MyRunnable my_runnable;      //  Thread       Runnable     。         Kingwomen         ?

31     public MyThread(MyRunnable myRunnable)

32     {

33         // TODO            

34         this.my_runnable = myRunnable;

35     }

36     public MyThread()  //      

37     {

38         

39     }

40     public void run()

41     {

42         my_runnable.run();  //      ,         。             

43     }

44     

45     public void start() //start         run!                    run,            start。start      run()  

46     {

47         run();

48     }

49 }

50 

51 class Demo1 extends MyThread   //    Thread      

52 {

53     @Override

54     public void run()

55     {

56         System.out.println("Demo1 is call the run()!!!");

57     }

58 }

59 

60 class Demo2 implements MyRunnable  //    Runnable        

61 {

62 

63     @Override

64     public void run()

65     {

66         // TODO          

67         System.out.println("Demo2 is call the run()!!!");

68     }

69     

70 }

실행 결과:
Demo1 is call the run()!!!익명 데모 is call the run ()!!!Demo2 is call the run()!!!
어때?Thread와 Runnable 인터페이스의 모형과 똑같지 않습니까?  

좋은 웹페이지 즐겨찾기