マルチスレッド実装:
- Threadクラスを継承します
- Runnableインターフェースを実装する
方法1:Threadクラスを継承する
- クラスを定義するMyThreadはThreadクラスを継承します
- MyThreadクラスのrunメソッドをオーバーライドします
- MyThreadクラスのオブジェクトを作成します
- スレッドを開始
コードの一部を見てみましょう
。MyThreadはrunメソッドを書き換えて、0〜99を出力します。
public class MyThread extends Thread {
@Override
public void run() {
for(int i=0;i<100;i++){
System.out.println(getName()+":"+i);
}
}
}
メインクラス:
public class ThreadDemo01 {
public static void main(String[] args) {
MyThread m1=new MyThread();
MyThread m2=new MyThread();
//m1.run();
//m2.run();
//void start() 导致此线程开始执行;JAVA虚拟机调用此线程的run方法
m1.start();
m2.start();
}
}
スレッド名を設定して取得する
Threadクラスでスレッド名を設定および取得するメソッド
- void setName(String name):このスレッドの名前をパラメーター名と同じになるように変更します
- String getName():このスレッドの名前を返します
- static Thread currentThread():メインメソッドのスレッド名を取得します
以下のコードでないパラメータ構成糸の、構築するためのパラメータで
MyThreadクラス:
public class MyThread extends Thread {
public MyThread() {
}//无参构造
public MyThread(String name) {
//带参构造
super(name);
}
@Override
public void run() {
for(int i=0;i<100;i++){
System.out.println(getName()+":"+i);
}
}
}
メインクラス
public class ThreadDemo {
public static void main(String[] args) {
/* MyThread m1=new MyThread();//无参构造
MyThread m2=new MyThread();
//m1.run();
//m2.run();
m1.setName("苹果");
m2.setName("香蕉");
//void start() 导致此线程开始执行;
//JAVA虚拟机调用此线程的run方法
*/
//Thread(String name)
MyThread m1=new MyThread("苹果");//带参构造
MyThread m2=new MyThread("香蕉");
m1.start();
m2.start();
//获取main方法线程名称
//static Thread currentThread() 返回对当前正在执行的线程对象的引用
//System.out.println(Thread.currentThread());
}
}
スレッドスケジューリング
スレッドには2つのスケジューリングモデルがあります
- タイムシェアリングスケジューリングモデル:すべてのスレッドが順番にCPUを使用する権利を使用
し、各スレッドが占めるタイムスライスを均等に分散します。 - プリエンプティブスケジューリングモデル:CPUを使用するために、優先度の高いスレッドに優先順位を付けます。スレッドの優先度が同じ場合、ランダムに選択されます。優先度の高いスレッドは、比較的多くのCPUタイムスライスを取得します。
-
Javaはプリエンプティブスケジューリングモデルを使用します
-
コンピュータにCPUが1つしかない場合、CPUは特定の時間に1つの命令しか実行できず、
スレッドはCPUタイムスライス、つまり使用権を取得した場合にのみ命令を実行できます。
したがって、誰がCPUを使用する権利を取得するかが定かでないため、マルチスレッドプログラムの実行はランダムです。
Threadクラスでスレッドの優先度を設定および取得する方法
- public final int getPriority():このスレッドの優先度を返します
- public final void setPriority(int newPriority):このスレッドの優先度を変更します
コードを見てください:
MyThreadクラス:
public class MyThread extends Thread {
@Override
public void run() {
for(int i=0;i<100;i++){
System.out.println(getName()+":"+i);
}
}
}
メインクラス:
import 多线程.MyThread;
public class ThreadDemo {
public static void main(String[] args) {
MyThread m1=new MyThread();
MyThread m2=new MyThread();
MyThread m3=new MyThread();
m1.setName("苹果");
m2.setName("西瓜");
m3.setName("菠萝");
//public final int getPriority():返回此线程的优先级
// System.out.println(m1.getPriority());//5
// System.out.println(m2.getPriority());//5
// System.out.println(m3.getPriority());//5
//public final void setPriority(int newPriority):更改此线程的优先级
// System.out.println(Thread.MAX_PRIORITY);//10
// System.out.println(Thread.MIN_PRIORITY);//1
// System.out.println(Thread.NORM_PRIORITY);//5 默认
m1.setPriority(5);
m2.setPriority(10);
m3.setPriority(1);
m1.start();
m2.start();
m3.start();
}
}
スレッドに一般的に使用される3つの方法
-
static void sleep(long millis)は、現在実行中のスレッドを指定されたミリ秒数の間停止(実行の一時停止)させます
-
void join():このスレッドが終了するのを待つ
-
void setDaemon(booleanon)は、このスレッドをデーモンスレッドとしてマークします。実行中のスレッドがすべてデーモンスレッドである場合、Java仮想マシンは終了します。
方法2:実行可能なインターフェースを実装する
- クラスMyRunnableを定義して、Runnableインターフェイスを実装します
- MyRunnableクラスのrun()メソッドをオーバーライドします
- MyRunnableクラスのオブジェクトを作成します
- Threadクラスのオブジェクトを作成し、MyRunnableオブジェクトをコンストラクターのパラメーターとして使用します
- スレッドを開始
コード:
MyRunnableクラス:
public class MyRunnable implements Runnable {
@Override
public void run() {
for(int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
メインクラス:
public class MyRunnableDemo {
public static void main(String[] args) {
//创建MyRunnable类的对象
MyRunnable m=new MyRunnable();
//创建Thread类的对象,把MyRunnable对象作为构造方法的参数
//Thread (Runnable target)
//Thread t1=new Thread(m);
//Thread t2=new Thread(m);
//Thread (Runnable target,String name)传递对象并设置名字
Thread t1=new Thread(m,"高铁");
Thread t2=new Thread(m,"飞机");
t1.start();
t2.start();
}
}
Threadクラスを継承する場合と比較して、Runnableインターフェイスを実装する利点
- Javaの単一継承の制限を回避する
- 同じプログラムの複数のコードが同じリソースを処理するのに適しており、スレッドとプログラムのコードおよびデータを効果的に分離します。これにより、オブジェクトに向けられた設計アイデアがより適切に反映されます。