JavaにおけるThreadとRunnableの二三事
5388 ワード
まず2つの問題を提起し、この2つの問題を持って下を見ます.
1.マルチスレッドを実装するには、javaのマルチスレッドを習い始めたばかりの頃、マルチスレッドがスレッドクラスを実行するrunメソッドであることしか知らなかったので、コードでrunメソッドを手動で呼び出しましたが、実際には無効です.だからここも簡単に書いて、同じ初心者たちへの小さな注意です.
2.スレッド間のリソース共有を実現
JAvaでマルチスレッドを実現するには2つの方法がある:1.Threadクラス2を継承する.Runnableインタフェースの実装
最初のメソッドについて、Threadクラスを継承します.
まず,マルチスレッドがスレッドクラスを実行するrun()メソッドであることを知ったので,ここではスレッドクラスのrun()メソッドを複写し,呼び出した.
出力結果:
実行結果から,これらの出力はいずれも規則的であり,想像したようにマルチスレッドを実現していないことが分かる.
これは,1つのスレッドが実際に実行されているのがrunメソッドのコードであることを知っているからである.だからrunメソッドを直接呼び出しましたが、マルチスレッドにはオペレーティングシステムのサポートが必要です.Threadクラスで定義されたstartメソッドでは、private native void start 0()メソッドが呼び出されます.ここでnativeは、このメソッドが最下位のオペレーティングシステムとインタラクティブになり、オペレーティングシステムのマルチスレッドサポートを開始できるローカルメソッドであることを示しています.これがJNI(Java Native Interface)javaローカルインタフェースです.だから単純にrunメソッドを呼び出すのはだめです.startメソッドを呼び出すと本当にマルチスレッドを開くことができます.
上のコード修22、23行は次のように変更されました.
ここまで私たちの1番目の問題も解答されました.
第2の方法については、runnableインタフェースを実装するクラス宣言は、以前と大きく異なるが、主関数では異なる.異なるのは、runnableインタフェースを実装するクラスにstartメソッドがないため、スレッドを開くことができないが、焦らないで、Threadクラスを見て、彼は構造方法public Thread(Runnable targer)を持っている.コードには次のように書くことができます.
これにより、スレッドを1つのThreadインスタンスで間接的に開くことができます.
では、2つ目の問題、リソース共有を見てみましょう.最も古典的なのは切符を買う問題です.
このようにして実行されたのは、3つのスレッドが同時に1つのデータを操作し、3つのウィンドウが同時に1つの汽車の切符を売っているように、全部で10枚ある.
1.マルチスレッドを実装するには、javaのマルチスレッドを習い始めたばかりの頃、マルチスレッドがスレッドクラスを実行するrunメソッドであることしか知らなかったので、コードでrunメソッドを手動で呼び出しましたが、実際には無効です.だからここも簡単に書いて、同じ初心者たちへの小さな注意です.
2.スレッド間のリソース共有を実現
JAvaでマルチスレッドを実現するには2つの方法がある:1.Threadクラス2を継承する.Runnableインタフェースの実装
最初のメソッドについて、Threadクラスを継承します.
まず,マルチスレッドがスレッドクラスを実行するrun()メソッドであることを知ったので,ここではスレッドクラスのrun()メソッドを複写し,呼び出した.
class MyThread extends Thread{
int t = 10;
String name = "";
MyThread(String name){
super(name);
this.name = name;
}
public void run(){
while(t > 0){
System.out.println(name + ":" + t--);
}
}
}
class s1{
public static void main(String args[]){
MyThread m1 = new MyThread("m1");
MyThread m2 = new MyThread("m2");
m1.run();
m2.run();
}
}
出力結果:
m1:10
m1:9
m1:8
m1:7
m1:6
m1:5
m1:4
m1:3
m1:2
m1:1
m2:10
m2:9
m2:8
m2:7
m2:6
m2:5
m2:4
m2:3
m2:2
m2:1
実行結果から,これらの出力はいずれも規則的であり,想像したようにマルチスレッドを実現していないことが分かる.
これは,1つのスレッドが実際に実行されているのがrunメソッドのコードであることを知っているからである.だからrunメソッドを直接呼び出しましたが、マルチスレッドにはオペレーティングシステムのサポートが必要です.Threadクラスで定義されたstartメソッドでは、private native void start 0()メソッドが呼び出されます.ここでnativeは、このメソッドが最下位のオペレーティングシステムとインタラクティブになり、オペレーティングシステムのマルチスレッドサポートを開始できるローカルメソッドであることを示しています.これがJNI(Java Native Interface)javaローカルインタフェースです.だから単純にrunメソッドを呼び出すのはだめです.startメソッドを呼び出すと本当にマルチスレッドを開くことができます.
上のコード修22、23行は次のように変更されました.
m1.start();
m2.start();
ここまで私たちの1番目の問題も解答されました.
第2の方法については、runnableインタフェースを実装するクラス宣言は、以前と大きく異なるが、主関数では異なる.異なるのは、runnableインタフェースを実装するクラスにstartメソッドがないため、スレッドを開くことができないが、焦らないで、Threadクラスを見て、彼は構造方法public Thread(Runnable targer)を持っている.コードには次のように書くことができます.
// MyThread runnable
MyThread my = new MyThread();
new Thread(my).start;
これにより、スレッドを1つのThreadインスタンスで間接的に開くことができます.
では、2つ目の問題、リソース共有を見てみましょう.最も古典的なのは切符を買う問題です.
class MyThread implements Runnable{
private static int ticket=10;
public void run(){
while(ticket>0){
System.out.println(Thread.currentThread().getName()+':'+ticket--);
}
}
}
public class TestThread{
public static void main(String[] args){
MyThread mt=new MyThread();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
}
}
このようにして実行されたのは、3つのスレッドが同時に1つのデータを操作し、3つのウィンドウが同時に1つの汽車の切符を売っているように、全部で10枚ある.