Threadクラスのrun()メソッドをカスタマイズします.super()です.runの理解
Threadクラスのrunメソッドを書き換えると、このようなコードがよく見られます.
このsuper()はいったい何の役に立つのでしょうか.まず、Threadクラスの実装を見てみましょう.
上の図から,Threadクラスのコンストラクション関数を用いて,Runnableインタフェースを独自に実装し,Thread(Runnable target)コンストラクション関数を用いてrun()メソッドを書き換えることで,我々が必要とする機能を実現できることを解析した.では、このsuper()を私たち自身のMyThreadに書き込むのはどんな役割を果たすのでしょうか.
実装したMyThreadクラスにrunnableを受け入れるコンストラクション関数を追加し、Runnableインタフェースで現在のスレッドを印刷(MyThreadの印刷と一致)し、コードテストを行います.
テスト結果は次のとおりです.
MyRunnableのrun()とMyThreadクラスのrun()は同じスレッドで、両方の関数が実行されます.
public void run() {
super.run();
System.out.println(Thread.currentThread().getName());
}
このsuper()はいったい何の役に立つのでしょうか.まず、Threadクラスの実装を見てみましょう.
private Runnable target;
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
@Override
public void run() {
if (target != null) {
target.run();
}
}
上の図から,Threadクラスのコンストラクション関数を用いて,Runnableインタフェースを独自に実装し,Thread(Runnable target)コンストラクション関数を用いてrun()メソッドを書き換えることで,我々が必要とする機能を実現できることを解析した.では、このsuper()を私たち自身のMyThreadに書き込むのはどんな役割を果たすのでしょうか.
public class MyThread extends Thread {
MyThread(Runnable runnable) {
super(runnable);
}
public void run() {
super.run();
System.out.println(Thread.currentThread().getName());
}
}
実装したMyThreadクラスにrunnableを受け入れるコンストラクション関数を追加し、Runnableインタフェースで現在のスレッドを印刷(MyThreadの印刷と一致)し、コードテストを行います.
public class MyThreadTest {
public static void main(String[] args ) {
Runnable runnable = new MyRunnable();
MyThread myThread = new MyThread(runnable);
myThread.start();
System.out.println(Thread.currentThread().getName());
}
}
テスト結果は次のとおりです.
main
Thread-0
Thread-0
MyRunnableのrun()とMyThreadクラスのrun()は同じスレッドで、両方の関数が実行されます.