マルチスレッドの一般的な操作方法
スレッドの命名と取得
マルチスレッドの状態は不明であるため、スレッドの名前が唯一の識別マークになります。スレッド名を定義するときは、スレッドを開始する前に名前を設定する必要があります。名前を重複させないようにし、開始されたスレッドを変更しないようにしてください名前。
スレッドの状態が不明であるため、run()メソッドを実行しているスレッドを操作できるたびに、現在のスレッドオブジェクトを取得するメソッドは次のとおりです。public static Thread current Thread()
例:スレッドの名前を確認する
package Project.Study.Multithreading;
class MyTread4 implements Runnable{
@Override
public void run(){
System.out.println(Thread.currentThread().getName());//使用currentThread()取得当前线程对象后再取得具体的线程名字
}
}
public class Test4 {
public static void main(String [] args) throws Exception{
MyTread4 mt=new MyTread4();
new Thread(mt,"自己的线程A").start();
new Thread(mt).start();
new Thread(mt,"自己的线程B").start();
new Thread(mt).start();
new Thread(mt).start();
}
}
//结果:
//自己的线程A
//Thread-1
//自己的线程B
//Thread-0
//Thread-2
例:スレッド名を取得する
package Project.Study.Multithreading;
class MyTread4 implements Runnable{
@Override
public void run(){
System.out.println(Thread.currentThread().getName());//使用currentThread()取得当前线程对象后再取得具体的线程名字
}
}
public class Test4 {
public static void main(String [] args) throws Exception{
MyTread4 mt=new MyTread4();
new Thread(mt,"自己的线程A").start();
new Thread(mt).start();
mt.run();
}
}
//结果:
//main
//自己的线程A
//Thread-0
このプログラムを通じて、メインメソッド自体もスレッドに属していることがわかります。
各JVMプロセスは、少なくとも次の2つのスレッドを開始します:
1.メインスレッド:プログラムのメイン実行、およびサブルーチンの開始
2. gcスレッド:ガベージコレクションを担当します。
スレッドスリープ
スレッドスリープとは、プログラムの実行速度を遅くすることを指します。スレッドクラスのスレッドのスリープ操作メソッドは、public static void sleep(long millis)がInterruptedExceptionをスローし、設定されたスリープ単位はmsです。
例:睡眠の特徴を観察する
package Project.Study.Multithreading;
class MyThread5 implements Runnable{
@Override
public void run(){
for (int x=0;x<10;x++){
try {
Thread.sleep(1000); //每次执行休眠1s
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+",x="+x);
}
}
}
public class Test5 {
public static void main(String []args){
MyThread5 mt1=new MyThread5();
MyThread5 mt2=new MyThread5();
MyThread5 mt3=new MyThread5();
new Thread(mt1,"自己的线程对象A").start();
new Thread(mt2,"自己的线程对象B").start();
new Thread(mt3,"自己的线程对象C").start();
}
}
//结果:
//自己的线程对象B,x=0
//自己的线程对象A,x=0
//自己的线程对象C,x=0
//自己的线程对象A,x=1
//自己的线程对象B,x=1
//自己的线程对象C,x=1
//自己的线程对象B,x=2
//自己的线程对象A,x=2
//自己的线程对象C,x=2
//...
//自己的线程对象C,x=9
//自己的线程对象B,x=9
//自己的线程对象A,x=9
上記のプログラムの結果は3つと3つの出力です(実際には幻想です)。毎秒3つのスレッドオブジェクトが出力されます。スレッドの切り替え速度が速すぎるため、すべてのスレッドがrun()メソッドに入る方法があります使用感はありますが、実際にはギャップがあります。
スレッドの優先順位
Javaのスレッド操作では、優先順位が最も高いスレッドが最初に実行される場合があります。スレッドの優先度を以下に示します。
スレッド優先度操作
番号。 | メソッドまたは定数 | タイプ | 説明文 |
---|---|---|---|
1 | public static final int MAX_PRIORITY | 一定 | 最高の優先順位、値は10 |
2 | public static final int NORM_PRIORITY | 一定 | 中優先度、値5 |
3 | public static final int MIN_PRIORITY | 一定 | 最も低い優先度、値は1 |
4 | public final void setPriority(int new Priority) | 普通の | スレッドの優先順位を設定する |
5 | public final int getPriority(); | 普通の | スレッドの優先順位を取得する |
例:スレッドの優先順位を設定する
package Project.Study.Multithreading;
class MyThread6 implements Runnable{
@Override
public void run(){
for(int x=0;x<20;x++){
try {
Thread.sleep(100);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+",x="+x);
}
}
}
public class Test6 {
public static void main(String [] args){
MyThread6 mt1 = new MyThread6();
Thread t1 = new Thread(mt1,"自己的线程对象A");
Thread t2= new Thread(mt1,"自己的线程对象B");
Thread t3=new Thread(mt1,"自己的线程对象C");
t1.setPriority(Thread.MIN_PRIORITY);
t2.setPriority(Thread.MAX_PRIORITY);
t3.setPriority(Thread.NORM_PRIORITY);
t1.start();
t2.start();
t3.start();
}
}
//结果:
//自己的线程对象C,x=0
//自己的线程对象A,x=0
//自己的线程对象B,x=0
//自己的线程对象A,x=1
//自己的线程对象C,x=1
//自己的线程对象B,x=1
//自己的线程对象C,x=2
//自己的线程对象A,x=2
//自己的线程对象B,x=2
//自己的线程对象B,x=3
//自己的线程对象C,x=3
//自己的线程对象A,x=3
//自己的线程对象B,x=4
//自己的线程对象A,x=4
//自己的线程对象C,x=4
//...
//自己的线程对象C,x=19
//自己的线程对象B,x=19
//自己的线程对象A,x=19
実行結果から、スレッドは必ずしもCPUリソースを取得できるとは限らないため、設定された優先順位に従ってスレッドの実行順序が実行されるとは限らないことがわかります。
お問い合わせ:メイン方式の優先度
public class Test6 {
public static void main(String [] args){
System.out.println(Thread.currentThread().getPriority());
}
}
//结果:
//5
メインメソッドの優先度は5であることがわかります