この記事では、Java でのマルチスレッドの基本的なメソッドの使用方法を紹介します (例を示します)。必要な方は参考にしていただければ幸いです。ヘルプ。
Thread.sleep(ミリ秒); sleep メソッドを使用して、スレッドをスリープ状態に設定できます。 sleep が静的メソッドであることがわかります。
public static native void sleep(long var0) throws InterruptedException;
try { System.out.println(new Date().getSeconds()); Thread.sleep(5000); System.out.println(new Date().getSeconds()); } catch (InterruptedException e) { e.printStackTrace(); }
デーモン以外のスレッドが停止し、デーモン スレッドが自動的に終了します
public static void main(String[] args) { Thread thread1 = new Thread() { @Override public void run() { super.run(); for(int i = 0; i < 5; i ++) { System.out.println("非守护线程"); } } }; Thread thread2 = new Thread() { @Override public void run() { for(int i = 0; i < 200; i ++) { System.out.println("守护线程"); } } }; thread2.setDaemon(true); thread1.start(); thread2.start(); }
thread2 であることは明らかです。を 200 回出力する必要がありますが、ここでは数行しか出力されません。これは、thread1 が実行を完了すると、thread2 がデーモン スレッドとして自動的に停止するためです。
jion メソッドが実行される場合、現在のスレッドを停止し、最初に jion() を実行したスレッドを実行します。これはキュージャンプ実行と同等です。以下のように、thread2 スレッドを実行するとき、i==20 の場合、thread1 がキューにジャンプして最初に実行されます。
public static void main(String[] args) { final Thread thread1 = new Thread() { @Override public void run() { super.run(); for(int i = 0; i < 500; i ++) { System.out.println("thread1---" + i); } } }; Thread thread2 = new Thread() { @Override public void run() { for(int i = 0; i < 200; i ++) { if (i == 20) { try { //插队执行 thread1.join(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(i); } } }; thread1.start(); thread2.start(); }
join() メソッドは、パラメーター long ミリ秒 join (ミリ秒)
を渡すこともできます。 ##setPriority はスレッドの優先順位を設定します。
優先順位が高くなるほど、優先順位が高くなります。
public static void main(String[] args) { final Thread thread1 = new Thread() { @Override public void run() { super.run(); for(int i = 0; i < 500; i ++) { System.out.println("thread1---" + i); } } }; Thread thread2 = new Thread() { @Override public void run() { for(int i = 0; i < 200; i ++) { if (i == 20) { try { //插队执行1毫秒 thread1.join(1); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(i); } } }; thread1.start(); thread2.start(); }
同期されたコード ブロック
public static void main(String[] args) { final Thread thread1 = new Thread() { @Override public void run() { super.run(); for(int i = 0; i < 500; i ++) { System.out.println( getName() + "---" + i); } } }; Thread thread2 = new Thread() { @Override public void run() { for(int i = 0; i < 200; i ++) { if (i % 5 == 0) { Thread.yield(); } System.out.println(getName() + "---" + i); } } }; thread1.start(); thread2.start(); }スレッド thread1 の実行中に、一部の出力が完全に出力されなかったことが判明しました。CPU はスレッド 2 によってプリエンプトされました。この場合、それは明らかに当社のビジネス ロジックと一致しません。したがって、スレッドが完全なメソッドを実行した後にのみ、CPU が他のスレッドによってプリエンプトされるようにする必要があります。Use synchronized
public static void main(String[] args) { final Thread thread1 = new Thread() { @Override public void run() { super.run(); for(int i = 0; i < 500; i ++) { System.out.println( getName() + "---" + i); } } }; Thread thread2 = new Thread() { @Override public void run() { for(int i = 0; i < 500; i ++) { System.out.println(getName() + "---" + i); } } }; //设置最大的线程优先级最大为10 thread1.setPriority(Thread.MIN_PRIORITY); //设置最小的线程优先级,最小为1 thread2.setPriority(Thread.MAX_PRIORITY); thread1.start(); thread2.start(); }synchronized 同期を使用した後コード ブロックを参照すると、上記の状況は発生しないことがわかります。同期メソッド
public class ThreadSynchronied { public static void main(String[] args) { final Say say = new Say(); Thread thread1 = new Thread() { @Override public void run() { for (int i = 0 ; i < 10000 ; i ++) { say.say(); } } }; Thread thread2 = new Thread() { @Override public void run() { for (int i = 0 ; i < 10000 ; i ++) { say.say1(); } } }; //设置最大的线程优先级最大为10 thread1.setPriority(Thread.MIN_PRIORITY); //设置最小的线程优先级,最小为1 thread2.setPriority(Thread.MAX_PRIORITY); thread1.start(); thread2.start(); } } class Say { void say() { System.out.print("s "); System.out.print("a "); System.out.print("y "); System.out.print("h "); System.out.print("e "); System.out.print("l "); System.out.print("l "); System.out.println("o"); } void say1() { System.out.print("1 "); System.out.print("2 "); System.out.print("3 "); System.out.print("4 "); System.out.print("5 "); System.out.print("6 "); System.out.print("7 "); System.out.println("8"); } }同期メソッドはメソッドのロックを指します
静的同期メソッドのオブジェクトは次のとおりです。このクラスのバイトコード オブジェクト
非静的同期メソッドのロック オブジェクトはこれです複数のスレッドが同じリソース ロックを使用するため、デッドロックが発生しやすくなりますデッドロックとは何ですか?
デッドロックとは、実行中に 2 つ以上のプロセスがリソースを競合したり、相互に通信したりすることによって発生するブロック現象を指します。外部の力がなければ、プロセスは先に進むことができません。このとき、システムがデッドロック状態にある、またはシステムがデッドロックを起こしているといいます。このような常に相互に待機しているプロセスをデッドロック プロセスといいます。
StringBuffer
HashTable
ArrayList
StringBuilder
HashSet
以上がJava でのマルチスレッドの基本的な方法の使用方法の紹介 (例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。