スレッド--スレッドの作成
14080 ワード
スレッド概念は、1つのプログラムの異なる実行経路として簡単に理解される.
上のこのプログラム、このクラス、何度呼び出しても、その実行パスは永遠に1つしかありません.つまりmain->m 1->m 2-->m 1->m 3->m 1->mainです.
では、どうやって新しいスレッドを開きますか?
Javaのスレッドはjava.lang.Threadというクラスが実現します.すべてのスレッドオブジェクトはここから生成され,newの場合構造関数には2つのカテゴリがあり,2つのスレッドオブジェクトを生成する方法に対応する.
Threadのインスタンスを作成することによって新しいスレッドを作成することができ、各スレッドは、スレッドボディと呼ばれる特定のThreadオブジェクトに対応するメソッドrun()によってその動作を完了する.つまり、スレッドを起動するということは、新しいプログラム実行パスを起動することです.何か実行しなければなりません.いったい何を実行しますか.run()メソッドにどの文を書いて実行しますか.runメソッドのコードが実行されると、この新しいスレッドは終わります.
スレッドは、Threadクラスのstart()メソッドを呼び出すことによって開始されます.
注意:run()メソッドを直接呼び出してrunの中のものを実行することはできません.これはメソッド呼び出しで、新しいスレッドを起動しなくても、新しいスレッドは生成されません.
具体的な実装では、新しいクラスを起動する方法は2つあります.いずれも私のクラスがスレッドクラスであることを示しています.
(1)Runnableインタフェースを実現し,もちろんTheadというクラス自体もこのインタフェースを実現しているので,これが根本である.
これによりmainのforループが実行されると2つのスレッドがあり、メインスレッドはforループを実行し、新しいスレッドは独自のrunメソッドのコードを実行します.現在は2つのスレッドがありますが、CPUで同時実行されています.
(2)Threadクラスから継承
上記のコードは、次のように直接簡略化できます.
以上の2つのメソッドはスレッドを作成することは可能ですが、インタフェースを使用できる場合はThreadクラスから継承しないでください.javaは単一継承のみをサポートしているため、インタフェースを実現する方法がより柔軟です.
1 public class Test
2 {
3 public static void main(String[] args)
4 {
5 m1();
6 }
7
8 public static void m1()
9 {
10 m2();
11 m3();
12 }
13
14 public static void m2(){}
15
16 public static void m3(){}
17 }
上のこのプログラム、このクラス、何度呼び出しても、その実行パスは永遠に1つしかありません.つまりmain->m 1->m 2-->m 1->m 3->m 1->mainです.
では、どうやって新しいスレッドを開きますか?
Javaのスレッドはjava.lang.Threadというクラスが実現します.すべてのスレッドオブジェクトはここから生成され,newの場合構造関数には2つのカテゴリがあり,2つのスレッドオブジェクトを生成する方法に対応する.
Threadのインスタンスを作成することによって新しいスレッドを作成することができ、各スレッドは、スレッドボディと呼ばれる特定のThreadオブジェクトに対応するメソッドrun()によってその動作を完了する.つまり、スレッドを起動するということは、新しいプログラム実行パスを起動することです.何か実行しなければなりません.いったい何を実行しますか.run()メソッドにどの文を書いて実行しますか.runメソッドのコードが実行されると、この新しいスレッドは終わります.
スレッドは、Threadクラスのstart()メソッドを呼び出すことによって開始されます.
注意:run()メソッドを直接呼び出してrunの中のものを実行することはできません.これはメソッド呼び出しで、新しいスレッドを起動しなくても、新しいスレッドは生成されません.
具体的な実装では、新しいクラスを起動する方法は2つあります.いずれも私のクラスがスレッドクラスであることを示しています.
(1)Runnableインタフェースを実現し,もちろんTheadというクラス自体もこのインタフェースを実現しているので,これが根本である.
1 public class TestThread1
2 {
3 public static void main(String[] args)
4 {
5 //
6 Runnable1 r = new Runnable1();
7
8 // run , ,
9 //r.run();
10
11 //
12 //
13 Thread t = new Thread(r);
14
15 //
16 t.start();
17
18 for(int i = 0; i < 100; i++)
19 {
20 System.out.println("Main Thread:" + i);
21 }
22
23 }
24
25 }
26
27 // class public, java public ,
28 class Runnable1 implements Runnable
29 {
30 public void run()
31 {
32 for(int i = 0; i < 100; i++)
33 {
34 System.out.println("Runnalbe1:" + i);
35 }
36
37 }
38
39 }
これによりmainのforループが実行されると2つのスレッドがあり、メインスレッドはforループを実行し、新しいスレッドは独自のrunメソッドのコードを実行します.現在は2つのスレッドがありますが、CPUで同時実行されています.
(2)Threadクラスから継承
1 public class TestThread2
2 {
3 public static void main(String[] args)
4 {
5 //
6 Runnable1 r = new Runnable1();
7
8 //
9 r.start();
10
11 //
12 //r.run();
13
14 for(int i = 0; i < 100; i++)
15 {
16 System.out.println("Main Thread----:" + i);
17 }
18 }
19 }
20
21
22 class Runnable1 extends Thread
23 {
24 public void run()
25 {
26 for(int i = 0; i < 100; i++)
27 {
28 System.out.println("Runnalbe1:" + i);
29 }
30 }
31 }
上記のコードは、次のように直接簡略化できます.
1 public class TestThread2 extends Thread
2 {
3 public static void main(String[] args)
4 {
5 //
6 Runnable1 r = new Runnable1();
7
8 //
9 r.start();
10
11 //
12 //r.run();
13
14 for(int i = 0; i < 100; i++)
15 {
16 System.out.println("Main Thread----:" + i);
17 }
18 }
19
20 public void run()
21 {
22 for(int i = 0; i < 100; i++)
23 {
24 System.out.println("Runnalbe1:" + i);
25 }
26 }
27 }
以上の2つのメソッドはスレッドを作成することは可能ですが、インタフェースを使用できる場合はThreadクラスから継承しないでください.javaは単一継承のみをサポートしているため、インタフェースを実現する方法がより柔軟です.