小さなテスト問題で、1つのスレッドはRunnableインタフェースを実現し、Thread方法を継承します.
今日は学校が始まる初日に、小さなテストをしました.
プログラムが正しく実行されているかどうかを尋ねると、エラーが報告されますか.スレッドの作成には2つの方法があります.
1.Threadクラスを継承し、そのrun()メソッドを複写する.(この方法では、サブクラスオブジェクトを作成するたびにスレッドが作成されます)
利点は,コードが簡単で,サブクラスを直接記述してThreadクラスを継承し,newサブクラスオブジェクトを呼び出し,親クラスのstart()メソッドを直接呼び出し,start()メソッドではサブクラスに複写されたrun()メソッドを呼び出し,カスタム動作を実行することである.
欠点は,1つのクラスが他のクラスを継承すると,Threadクラスを継承できなくなることである.
2、Runnableインタフェースを実現する.Runnableインタフェースにはrun()メソッドがあり、実行するコードをrun()メソッドに入れる.
利点は、Javaにおける単一継承の限界を解決し、スレッドはRunnableインタフェースを実現し、他のオブジェクトを継承することもできる.この方式でスレッドを作成すると、Runnableインタフェースを実現したオブジェクトが1つ伝わり、複数のスレッドがこのRunnableインタフェースを実現したオブジェクトを共有することができ、マルチスレッドが同じリソースを処理する場合に適している(典型的な例は、マルチウィンドウが同時にチケットを売る)
欠点は、スレッドを継承する方法よりもスレッドを作成するのが少し複雑です.
実際の開発過程では,第2の方法でスレッドを作成することを提案し,この方法は比較的柔軟で,より拡張性がある.
次に上のプログラムを見てみましょう.TestクラスはThreadクラスを継承し、Runnableインタフェースを実現しています.主関数では
実は2つ目のスレッド作成方式を使用していますが、その中で伝わるオブジェクトnew Test()はRunnableインタフェースを実現しています.ここで覚えておきたいのは、ThreadクラスもRunnableインタフェースを実現しています.同様にThreadクラスのサブクラスもRunnableインタフェースを実現しているので、以上のプログラムを以下に変更してもよいことです.
実行結果のスクリーンショット:
実行結果を見ることができます:現在のスレッド名は:Thread-1で、スレッドのデフォルトの名前はThread-x(xは0から始まる整数)のルールに従って命名されていることを知っています.では、Thread-0のスレッドは?
これは、クラスがThreadクラスを継承しているため、サブクラスオブジェクトを作成するとスレッドが作成されますが、スレッドが実行される場合はstart()メソッドを呼び出してスレッドを開く必要があります.
public class Test extends Thread implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 50; i++) {
System.out.println("This is the test"+i);
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread thread = new Thread(new Test());
thread.start();
}
}
プログラムが正しく実行されているかどうかを尋ねると、エラーが報告されますか.スレッドの作成には2つの方法があります.
1.Threadクラスを継承し、そのrun()メソッドを複写する.(この方法では、サブクラスオブジェクトを作成するたびにスレッドが作成されます)
利点は,コードが簡単で,サブクラスを直接記述してThreadクラスを継承し,newサブクラスオブジェクトを呼び出し,親クラスのstart()メソッドを直接呼び出し,start()メソッドではサブクラスに複写されたrun()メソッドを呼び出し,カスタム動作を実行することである.
欠点は,1つのクラスが他のクラスを継承すると,Threadクラスを継承できなくなることである.
2、Runnableインタフェースを実現する.Runnableインタフェースにはrun()メソッドがあり、実行するコードをrun()メソッドに入れる.
利点は、Javaにおける単一継承の限界を解決し、スレッドはRunnableインタフェースを実現し、他のオブジェクトを継承することもできる.この方式でスレッドを作成すると、Runnableインタフェースを実現したオブジェクトが1つ伝わり、複数のスレッドがこのRunnableインタフェースを実現したオブジェクトを共有することができ、マルチスレッドが同じリソースを処理する場合に適している(典型的な例は、マルチウィンドウが同時にチケットを売る)
欠点は、スレッドを継承する方法よりもスレッドを作成するのが少し複雑です.
実際の開発過程では,第2の方法でスレッドを作成することを提案し,この方法は比較的柔軟で,より拡張性がある.
次に上のプログラムを見てみましょう.TestクラスはThreadクラスを継承し、Runnableインタフェースを実現しています.主関数では
Thread thread = new Thread(new Test());
実は2つ目のスレッド作成方式を使用していますが、その中で伝わるオブジェクトnew Test()はRunnableインタフェースを実現しています.ここで覚えておきたいのは、ThreadクラスもRunnableインタフェースを実現しています.同様にThreadクラスのサブクラスもRunnableインタフェースを実現しているので、以上のプログラムを以下に変更してもよいことです.
public class Test1 extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 50; i++) {
System.out.println("This is the test"+this.currentThread().getName()+" "+i);
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// Test1 t1 = new Test1();
// t1.start();
Thread thread = new Thread(new Test1());
thread.start();
}
}
実行結果のスクリーンショット:
実行結果を見ることができます:現在のスレッド名は:Thread-1で、スレッドのデフォルトの名前はThread-x(xは0から始まる整数)のルールに従って命名されていることを知っています.では、Thread-0のスレッドは?
これは、クラスがThreadクラスを継承しているため、サブクラスオブジェクトを作成するとスレッドが作成されますが、スレッドが実行される場合はstart()メソッドを呼び出してスレッドを開く必要があります.