スレッドの使用
1つ、スレッドクラス
java.lang.Threadクラスは、次のように、APIのこのクラスのスレッドに関連するいくつかのメソッドを定義します。
工法:
- public Thread():新しいスレッドオブジェクトを割り当てます。
- public Thread(String name):指定された名前で新しいスレッドオブジェクトを割り当てます。
- public Thread(Runnable target):指定されたターゲットに新しいスレッドオブジェクトを割り当てます。
- public Thread(Runnable target、String name):指定されたターゲットに新しいスレッドオブジェクトを割り当て、名前を指定します。
一般的な方法:
- public String getName():現在のスレッド名を取得します。
- public void start():このスレッドに実行を開始させます。Java仮想マシンはこのスレッドのrunメソッドを呼び出します。
- public void run():このスレッドによって実行されるタスクはここで定義されます。
- public static void sleep(long millis):現在実行中のスレッドを指定されたミリ秒数の間一時停止します(実行を一時的に停止します)。
- public static Thread currentThread():現在実行中のスレッドオブジェクトへの参照を返します。
APIを読んだ後、スレッドを作成する方法は2つあることを学びました。1つはThreadクラスを継承する方法で、もう1つはRunnableインターフェイスを実装する方法です。
次に、スレッドを作成します
1.Threadクラスを継承します
Threadクラスを継承してJavaでマルチスレッドを作成し、開始する手順は次のとおりです。
- Threadクラスのサブクラスを定義し、このクラスのrun()メソッドを書き直します。run()メソッドのメソッド本体は、スレッドが完了する必要のあるタスクを表すため、run()メソッドはスレッド実行本体と呼ばれます。
- Threadサブクラスのインスタンスを作成します。つまり、スレッドオブジェクトを作成します。
- スレッドオブジェクトのstart()メソッドを呼び出して、スレッドを開始します
コードは次のとおりです。
テスト:
public class Test{
public static void main(String[] args) {
//创建自定义线程对象
MyThread mt = new MyThread("新的线程!");
//开启新线程
mt.start();
//在主方法中执行for循环
for (int i = 0; i < 10; i++) {
System.out.println("我是main线程!"+i);
}
}
}
カスタムスレッドクラス:
public class MyThread extends Thread {
//定义指定线程名称的构造方法
public MyThread(String name) {
//调用父类的String参数的构造方法,指定线程的名称
super(name);
}
/**
* 重写run方法,完成该线程执行的逻辑
*/
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(getName()+":正在执行!"+i);
}
}
}
<------------------------------------------------- -------------------------------------------------- -------------------------------------->
2. Runnableインターフェイスを実装します。java.lang.Runnableの
使用も非常に一般的なものであり、runメソッドを書き直すだけで済みます。
次のように実行します。
- Runnableインターフェースの実装クラスを定義し、インターフェースのrun()メソッドを書き直します。run()メソッドのメソッド本体は、スレッドのスレッド実行本体でもあります。
- Runnable実装クラスのインスタンスを作成し、このインスタンスをThreadターゲットとして使用して、実際のスレッドオブジェクトであるThreadオブジェクトを作成します。
- スレッドオブジェクトのstart()メソッドを呼び出して、スレッドを開始します。
コードは次のとおりです。
テストクラス:
public class Test {
public static void main(String[] args) {
//创建自定义类对象 线程任务对象
MyRunnable mr = new MyRunnable();
//创建线程对象
Thread t = new Thread(mr, "小张");
t.start();
for (int i = 0; i < 20; i++) {
System.out.println("老王 " + i);
}
} }
オブジェクト:
public class MyRunnable implements Runnable{
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}
概要:Runnableインターフェイスを実装することにより、このクラスはマルチスレッドクラスの特性を備えています。run()メソッドは、マルチスレッドプログラムの実行ターゲットです。すべてのマルチスレッドコードはrunメソッドにあります。Threadクラスは、実際にはRunnableインターフェイスを実装するクラスです。
マルチスレッドを開始するときは、ThreadクラスのThread(Runnable target)構築メソッドを使用してオブジェクトを構築してから、Threadオブジェクトのstart()メソッドを呼び出してマルチスレッドコードを実行する必要があります。
実際、すべてのマルチスレッドコードは、Threadのstart()メソッドを実行することによって実行されます。したがって、Threadクラスを継承する場合でも、Runnableインターフェイスを実装してマルチスレッドを実現する場合でも、スレッドは最終的にThreadオブジェクトのAPIを介して制御されます。ThreadクラスのAPIに精通していることが、マルチスレッドプログラミングの基礎です。
スレッドとランナブルの違い
クラスがThreadを継承する場合、リソース共有には適していません。しかし、Runableインターフェースが実装されていれば、リソース共有を簡単に実現できます。
要約すると、次のようになります
。Threadクラスを継承するよりもRunnableインターフェイスを実装することの利点:
- 同じプログラムコードの複数のスレッドが同じリソースを共有するのに適しています。
- javaでの単一継承の制限を回避できます。
- プログラムの堅牢性を高め、デカップリング操作を実現し、コードを複数のスレッドで共有でき、コードとスレッドは独立しています。
- スレッドプールは、RunableクラスまたはCallableクラスを実装するスレッドにのみ配置でき、Threadを継承するクラスに直接配置することはできません。
***注意!*** javaでは、プログラムが実行されるたびに少なくとも2つのスレッドが開始されます。1つはメインスレッドで、もう1つはガベージコレクションスレッドです。javaコマンドを使用してクラスが実行されるたびに、JVMが実際に開始され、各JVMが実際にオペレーティングシステムでプロセスを開始するためです。