Java面接知識点(31)マルチスレッド起動方式
14236 ワード
一、Threadクラスの継承
threadクラスを継承しrunメソッドを書き換え、クラスオブジェクトをインスタンス化しstartメソッドを呼び出す
コードの例
実行結果(結果が一意ではない)
二、Runnableインタフェースの実現
runnableインタフェースを実装し、runメソッドを書き換え、クラスオブジェクトをインスタンス化し、threadクラスのオブジェクトをインスタンス化し、runnableインタフェースを実装したオブジェクトをパラメータとしてthreadオブジェクトに転送し、threadクラスオブジェクトのstartメソッドを呼び出す.
コードの例
実行結果(結果が一意ではない)
この2つのスレッドを作成する方法は、最初の作成方法がThreadを継承した後、他の親を継承できないため、2番目の(Runnableインタフェースを実装する)ほうが良いに違いありません.
補足:なぜスレッドの書き換えはrunにあり、マルチスレッドを起動する方法はstartですか?
1.start()メソッドはスレッドを起動し、本当にマルチスレッド実行を実現します.この場合runメソッドボリュームコードの実行が完了するのを待つ必要はなく、直接次のコードを実行することができます.Threadクラスのstart()メソッドを呼び出してスレッドを起動します.このスレッドは準備完了で実行されません.その後、このThreadクラスがメソッドrun()を呼び出して実行を完了し、ここでメソッドrun()はスレッドボディと呼ばれ、実行するこのスレッドの内容が含まれており、Runメソッドの実行が終了し、このスレッドが終了する.その後、CPUは他のスレッドをスケジューリングする.
2.run()メソッドは、通常のメソッドとして呼び出されます.プログラムは順番に実行するか、runメソッド体の実行が完了してから、次のコードを実行し続けることができます.プログラムにはプライマリ・スレッドしかありません.このスレッドは、プログラム実行パスが1つしかありません.これにより、書き込みスレッドの目的が達成されません.
threadクラスを継承しrunメソッドを書き換え、クラスオブジェクトをインスタンス化しstartメソッドを呼び出す
コードの例
public class thread1 extends Thread {
public void run() {
for (int i = 1; i <= 10; i++) {
System.out.println(i+" run1()");
}
}
public static void main(String args[]){
thread1 t1 = new thread1();
t1.start();
for (int i = 1; i <= 10; i++) {
System.out.println(i+" main1()");
}
}
}
実行結果(結果が一意ではない)
1 main1()
1 run1()
2 run1()
3 run1()
4 run1()
5 run1()
6 run1()
7 run1()
8 run1()
9 run1()
10 run1()
2 main1()
3 main1()
4 main1()
5 main1()
6 main1()
7 main1()
8 main1()
9 main1()
10 main1()
二、Runnableインタフェースの実現
runnableインタフェースを実装し、runメソッドを書き換え、クラスオブジェクトをインスタンス化し、threadクラスのオブジェクトをインスタンス化し、runnableインタフェースを実装したオブジェクトをパラメータとしてthreadオブジェクトに転送し、threadクラスオブジェクトのstartメソッドを呼び出す.
コードの例
public class thread2 implements Runnable {
@Override
public void run() {
for (int i = 1; i <= 10; i++) {
System.out.println(i+" run()");
}
}
public static void main(String args[]){
thread2 t2 = new thread2();
Thread t = new Thread(t2);
t.start();
for (int i = 1; i <= 10; i++) {
System.out.println(i+" main()");
}
}
}
実行結果(結果が一意ではない)
1 main()
1 run()
2 main()
2 run()
3 run()
4 run()
5 run()
6 run()
7 run()
8 run()
9 run()
10 run()
3 main()
4 main()
5 main()
6 main()
7 main()
8 main()
9 main()
10 main()
この2つのスレッドを作成する方法は、最初の作成方法がThreadを継承した後、他の親を継承できないため、2番目の(Runnableインタフェースを実装する)ほうが良いに違いありません.
補足:なぜスレッドの書き換えはrunにあり、マルチスレッドを起動する方法はstartですか?
1.start()メソッドはスレッドを起動し、本当にマルチスレッド実行を実現します.この場合runメソッドボリュームコードの実行が完了するのを待つ必要はなく、直接次のコードを実行することができます.Threadクラスのstart()メソッドを呼び出してスレッドを起動します.このスレッドは準備完了で実行されません.その後、このThreadクラスがメソッドrun()を呼び出して実行を完了し、ここでメソッドrun()はスレッドボディと呼ばれ、実行するこのスレッドの内容が含まれており、Runメソッドの実行が終了し、このスレッドが終了する.その後、CPUは他のスレッドをスケジューリングする.
2.run()メソッドは、通常のメソッドとして呼び出されます.プログラムは順番に実行するか、runメソッド体の実行が完了してから、次のコードを実行し続けることができます.プログラムにはプライマリ・スレッドしかありません.このスレッドは、プログラム実行パスが1つしかありません.これにより、書き込みスレッドの目的が達成されません.