従来のスレッドテクノロジー

6170 ワード

スレッドはjava 1ではありません.5以降の新技術では、(java 1.5以前)従来のスレッド作成には2つの方法がある:1)Threadクラスを継承する;2)Runnableインタフェースを実現する.
1)Threadクラスを継承する:
 1     Thread thread1 = new Thread(){
 2             @Override
 3             public void run() {
 4                 while(true){
 5                     try {
 6                         Thread.sleep(500);
 7                     } catch (InterruptedException e) {
 8                         // TODO Auto-generated catch block
 9                         e.printStackTrace();
10                     }
11                         System.out.println(Thread.currentThread().getId());
12                 }
13             }
14         };
15         thread1.start();

この方法はThreadのサブクラスを作成し,Threadクラスを上書きするrunメソッドである.threadのstartメソッドを呼び出すとrunメソッド内の内容が実行されます.
2)Runnableインタフェースを実現する:
 1      Thread thread2 = new Thread(new Runnable() {    
 2             @Override
 3             public void run() {
 4                 while(true){
 5                     try {
 6                         Thread.sleep(500);
 7                     } catch (InterruptedException e) {
 8                         // TODO Auto-generated catch block
 9                         e.printStackTrace();
10                     }
11                     System.out.println(Thread.currentThread().getName());
12                 }
13             }
14         });
15         thread2.start();

Threadのソースコードを表示すると、Threadクラスの実装ソースコードが発見され、ThreadクラスがRunnableインタフェースを実装していることが発見され、そのrun方式は以下のように実現される.
1  @Override
2     public void run() {
3         if (target != null) {
4             target.run();
5         }
6     }

runメソッドのtargetオブジェクトは、Threadの構築メソッドに導入されます.
1 public Thread(Runnable target) {
2         init(null, target, "Thread-" + nextThreadNum(), 0);
3 }

したがってrunnableメソッド呼び出しを継承するのもrunメソッドです.
3)スレッド作成の拡張:
スレッドサブスレッドをrunメソッドとrunnableパラメータを同時に上書きする場合は、次のように設定します.
 1       Thread thread3 = new Thread(new Runnable() {
 2             
 3             @Override
 4             public void run() {
 5                 while(true){
 6                     try {
 7                         Thread.sleep(500);
 8                     } catch (InterruptedException e) {
 9                         // TODO Auto-generated catch block
10                         e.printStackTrace();
11                     }
12                     System.out.println("runnable"+Thread.currentThread().getName());
13                 }
14             }
15         }){
16 
17             @Override
18             public void run() {
19                 while(true){
20                     try {
21                         Thread.sleep(500);
22                     } catch (InterruptedException e) {
23                         // TODO Auto-generated catch block
24                         e.printStackTrace();
25                     }
26                     System.out.println("thread"+Thread.currentThread().getName());
27                 }
28             }
29             
30         };
31         thread3.start();

スレッド実行ではrunメソッドが実行されます.runメソッドはThreadのサブクラスが親を上書きするメソッドであるため、親runメソッドとは関係なく、サブクラスが実行されるrunメソッドはすべて実行されます.サブクラスが親を上書きするrunメソッドがない場合、runnableのrunメソッドが実行されます.
注意:runメソッドの直接呼び出しは、新しいスレッドを作成するのではなく、メインスレッドでrunメソッドを直接実行します.通常のメソッド呼び出しと何の違いもありません.実際のアプリケーションではrunnableインタフェースを実装する方法が一般的です.Threadクラスを直接継承すると、Runnableインタフェースを実装するよりも簡潔に見えるかもしれませんが、Javaでは単一継承のみが許可されているため、カスタムクラスが他のクラスを継承する必要がある場合は、Runnableインタフェースを実装するしか選択できません.さらにrunnableインタフェースを実現することは,オブジェクト向けプログラミングの考え方により適合する.