スレッドはプログラム内の実行パスです。私たちがよく知っている主なメソッドは、実際には単一の実行パスです。プログラム内に実行パスが 1 つしかない場合、プログラムは次のようになります。単一の実行パス スレッド化されたプログラム; スレッドが 1 つであるため、マルチスレッドも存在します 文字通りの意味は、「単一のスレッドに対するソフトウェアおよびハードウェア上の複数の実行プロセスのテクノロジ」と理解できます。マルチスレッドの利点は、 CPU レートの使用率を向上させることです。マルチスレッド プログラムでは、1 つのスレッドが待機する必要がある場合、CPU は待機する代わりに他のスレッドを実行できるため、プログラムの効率が大幅に向上します。
マルチスレッドの作成方法 1: Thread クラスを継承方法 1 の作成プロセス:- サブクラスを定義するMyThread スレッド クラス java.lang.Thread を継承し、run() メソッドをオーバーライドします。
- MyThread クラスのオブジェクトを作成します。
- スレッド オブジェクトを呼び出す start() メソッドはスレッドを開始します (run() メソッドは起動後も実行されます);
public class ThreadDemo01 { public static void main(String[] args) { MyThread myThread1 = new MyThread(); myThread1.start(); for (int i = 0; i < 3; i++) { System.out.println("主线程正在执行~~"); } } } class MyThread extends Thread{ @Override public void run() { for (int i = 0; i < 3; i++) { System.out.println("子线程正在执行~~"); } } } //输出结果(不唯一): //主线程正在执行~~ //主线程正在执行~~ //主线程正在执行~~ //子线程正在执行~~ //子线程正在执行~~ //子线程正在执行~~
- 上記のコードでは 2 つのスレッドが実行されています。メインスレッドとメインメソッドのスレッド 子スレッドは、オブジェクト mythread で start() を呼び出すことによって開始されました。しかし、なぜ出力結果が一意ではないのでしょうか?その理由は、実行中に 2 つのスレッド間で CPU プリエンプションが発生し、最初にそれを獲得した方が最初に実行されるためです。
- 長所: コーディングが簡単;
- 短所: スレッド クラスは Thread と継承できません 他のクラスは拡張に役立ちません;
メソッド | |
現在のスレッドの名前を指定できます | ##public Thread (実行可能なターゲット) |
public Thread (Runnable target, String name) | |
欠点: プログラミング オブジェクトのパッケージ化にもう 1 つの層があり、スレッドに実行結果がある場合、それを直接返すことができません。
次に、Runnable インターフェイス (匿名内部クラス フォーム) を使用してマルチスレッドの作成を実現します:
1. Runnable 匿名内部クラス オブジェクトを作成します;
2. 処理は Thread に任せます;
3. スレッド オブジェクトの start() を呼び出してスレッドを開始します;
//正常版: public class ThreadDemo01 { public static void main(String[] args) { Thread thread = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 3; i++) { System.out.println("子线程正在执行~~"); } } }); thread.start(); for (int i = 0; i < 3; i++) { System.out.println("主线程正在执行~~"); } } } //lambda简化版: new Thread(()-> { for (int i = 0; i < 3; i++) { System.out.println("子线程正在执行~~"); } }).start();
本質的には、このメソッドには大きな違いはありません。オブジェクトは作成する必要がある単なるスレッドですが、もう 1 つは匿名の内部クラスを通じてマルチスレッドです。また、このコード ブロックはラムダ式によって効率化することもできます。この知識ポイントにまだ感銘を受けているでしょうか?忘れた場合は、次の記事を参照してください: Java でラムダ式を理解する方法 - 合理化された
方法 3: Callable インターフェイスを実装する
マルチスレッドを作成する前の 2 つの方法を学習した後、 1. 書き換えられた run() メソッドは結果を直接返すことができない; 2. スレッドの実行結果を返す必要があるビジネス シナリオには適していない。したがって、これらの問題を解決するには 3 番目の方法が必要です。
メソッド 3 の作成プロセス:
1. Callable インターフェイスを実装するクラスを定義し、call() メソッドをオーバーライドし、実行する必要があることをカプセル化します。 2. FutureTask を使用して Callable を変換します オブジェクトはスレッド タスク オブジェクトにカプセル化されます;
3. スレッド タスク オブジェクトを処理のために Thread に渡します;
4. の start() メソッドを呼び出しますスレッドを起動してタスクを実行するスレッド;
5. スレッドの実行完了後、FutureTask の get() メソッドでタスクの実行結果を取得します。
メソッド名
#説明
Encapsulate Callable オブジェクトを FutureTask オブジェクトに変換します | ||
呼び出しメソッドを実行するスレッドによって返された結果を取得します |
方式 | 优点 | 缺点 |
继承Thread类 | 编程比较简单,可以直接使用Thread类中的方法 | 扩展性较差,不能再继承其他的类,不能返回线程执行的结果 |
实现Runnable接口 | 扩展性强,实现该接口的同时还可以继承其他的类 | 编程相对复杂,不能返回线程执行的结果 |
实现Callable接口 | 扩展性强,实现该接口的同时还可以继承其他的类,可以得到线程的执行结果 | 编程相对复杂 |
常用方法
Thread获取和设置线程名称
方法名称 | 说明 |
String getName() | 获取当前线程的名称,默认线程名称是Thread-索引 |
void setName(String name) | 将此线程更改为指定的名称,通过构造器也可以设置线程名称 |
简单地通过一段代码让大家能够清晰地了解这个代码该如何使用:
public class ThreadDemo04 { public static void main(String[] args) throws Exception { thread thread1 = new thread(); thread1.setName("1号子线程"); thread1.start(); thread thread2 = new thread(); thread2.setName("2号子线程"); thread2.start(); } } class thread extends Thread { @Override public void run() { for (int i = 0; i < 3; i++) { System.out.println(this.getName()+"正在执行任务"+i); } } } //输出结果: //2号子线程正在执行任务0 //1号子线程正在执行任务0 //2号子线程正在执行任务1 //1号子线程正在执行任务1 //2号子线程正在执行任务2 //1号子线程正在执行任务2
Thread类的线程休眠方法
方法名称 | 说明 |
public static void sleep(long time) | 让当前线程休眠指定的时间后再继续执行,单位为毫秒 |
public class ThreadDemo05 { public static void main(String[] args) throws Exception { for (int i = 0; i < 5; i++) { System.out.println(i); if (i==3){ Thread.sleep(5000); } } } } //输出结果: //1 //2 //3 //在输出过3以后,等待5秒之后再进行输出 //4
以上がJavaのスレッドを理解する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

この記事では、Javaプロジェクト管理、自動化の構築、依存関係の解像度にMavenとGradleを使用して、アプローチと最適化戦略を比較して説明します。

この記事では、MavenやGradleなどのツールを使用して、適切なバージョン化と依存関係管理を使用して、カスタムJavaライブラリ(JARファイル)の作成と使用について説明します。

この記事では、カフェインとグアバキャッシュを使用してJavaでマルチレベルキャッシュを実装してアプリケーションのパフォーマンスを向上させています。セットアップ、統合、パフォーマンスの利点をカバーし、構成と立ち退きポリシー管理Best Pra

この記事では、キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPAを使用することについて説明します。潜在的な落とし穴を強調しながら、パフォーマンスを最適化するためのセットアップ、エンティティマッピング、およびベストプラクティスをカバーしています。[159文字]

Javaのクラスロードには、ブートストラップ、拡張機能、およびアプリケーションクラスローダーを備えた階層システムを使用して、クラスの読み込み、リンク、および初期化が含まれます。親の委任モデルは、コアクラスが最初にロードされ、カスタムクラスのLOAに影響を与えることを保証します


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境
