従来のスレッドテクノロジー
6170 ワード
スレッドはjava 1ではありません.5以降の新技術では、(java 1.5以前)従来のスレッド作成には2つの方法がある:1)Threadクラスを継承する;2)Runnableインタフェースを実現する.
1)Threadクラスを継承する:
この方法はThreadのサブクラスを作成し,Threadクラスを上書きするrunメソッドである.threadのstartメソッドを呼び出すとrunメソッド内の内容が実行されます.
2)Runnableインタフェースを実現する:
Threadのソースコードを表示すると、Threadクラスの実装ソースコードが発見され、ThreadクラスがRunnableインタフェースを実装していることが発見され、そのrun方式は以下のように実現される.
runメソッドのtargetオブジェクトは、Threadの構築メソッドに導入されます.
したがってrunnableメソッド呼び出しを継承するのもrunメソッドです.
3)スレッド作成の拡張:
スレッドサブスレッドをrunメソッドとrunnableパラメータを同時に上書きする場合は、次のように設定します.
スレッド実行ではrunメソッドが実行されます.runメソッドはThreadのサブクラスが親を上書きするメソッドであるため、親runメソッドとは関係なく、サブクラスが実行されるrunメソッドはすべて実行されます.サブクラスが親を上書きするrunメソッドがない場合、runnableのrunメソッドが実行されます.
注意:runメソッドの直接呼び出しは、新しいスレッドを作成するのではなく、メインスレッドでrunメソッドを直接実行します.通常のメソッド呼び出しと何の違いもありません.実際のアプリケーションではrunnableインタフェースを実装する方法が一般的です.Threadクラスを直接継承すると、Runnableインタフェースを実装するよりも簡潔に見えるかもしれませんが、Javaでは単一継承のみが許可されているため、カスタムクラスが他のクラスを継承する必要がある場合は、Runnableインタフェースを実装するしか選択できません.さらに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インタフェースを実現することは,オブジェクト向けプログラミングの考え方により適合する.