ホームページ 类库下载 java类库 Javaマルチスレッド実装

Javaマルチスレッド実装

Nov 02, 2016 am 10:01 AM
java

1. スレッドとは何ですか?

スレッド: プログラム内の単一の逐次制御プロセス。プロセス内の比較的独立したスケジュール可能な実行ユニットは、システムが CPU を独立してスケジュールおよびディスパッチするための基本ユニットです。

マルチスレッド: 複数のスレッドを同時に実行して、1 つのプログラム内で異なるタスクを完了することをマルチスレッドと呼びます。

特徴:

1) 軽量プロセス。プログラム実行フローの最小実行単位です。スレッドはシステム リソースを所有せず、複数のスレッドがプロセスが所有するリソースを共有します。

2) 1 つのスレッドが別のスレッドを作成でき、複数のスレッドを同時に実行できます。

3) システム動作中に複数のスレッドがリソースを占有する場合、並列実行のように見えますが、実際にはシーケンスが存在します。

4) プロセスには少なくとも 1 つのスレッド (メインスレッド) が含まれます。

2. スレッドのステータスは何ですか?

Javaマルチスレッド実装

スレッドには、新規、準備完了、実行中、ブロック、終了の 5 つの状態があります。

①New: Thread th = new Thread() などのメソッドを実行せずにスレッドを作成します。

②Ready: スレッドの start メソッドが呼び出されると、スレッドのステータスが Ready 状態に変わり、CPU の呼び出しを待ちます。準備完了状態のスレッドのみが CPU によってスケジュールされ、単一の CPU ではすぐには実行されません。

③実行: CPU がこのスレッドへの呼び出しを開始すると、実行状態に入ります。

④ブロック: スレッドが何らかの理由で CPU を使用する権利を失った場合、そのスレッドはブロックされます。

1) スリープ (ロングミル): パラメーターはミリ秒であるため、スレッドは指定された時間内にブロックに入ります。時間が経過すると、準備が整います。

2)サスペンド()とレジューム():サスペンドするとスレッドがハングするため、スレッドを再開するにはレジュームを実行する必要があります。

3) yield(): sleep() に似ていますが、ユーザーは一時停止する時間を指定できません。ブロッキングに入らずに同じ優先度のスレッドにのみ機会を与えることができます。行列と同じように、前の人と後ろの人が入れ替わりますが、それでも行列にいます。

4) wait() と Notice(): wait() には 2 つの形式があり、1 つはミリ秒数を指定し、もう 1 つはパラメータを持ちません。前者は、notify() を通じて呼び出すことができますが、後者は、notify() を通じて呼び出す必要があります。

5) 同期ブロッキング: 同期ロック リソースを待機します。複数のスレッドが同じリソースをめぐって競合する場合、ロックを取得できるのは 1 つのスレッドだけであり、他のスレッドは待機する必要があります。

⑤終了:スレッドの実行が終了、または例外が発生してスレッドが終了します。

3. スレッドを作成するにはどうすればよいですか?

Java スレッドを実装するには 3 つの方法があります: Thread クラスの継承、Runnable インターフェイスの実装、Callable と FutureTask の使用 (戻り値を持つことができます)

1. Thread クラス

class を統合して run() メソッドをオーバーライドします。 MyThread extends Thread {

@Override

public void run() {

for (int i = 0; i

System.out.println(Thread.currentThread().getName() + " " + i ;

MyThread th1 = 新しい MyThread();

MyThread th2 = 新しい MyThread();

th1.start();

th2.start();

}

}

出力: main

Thread-1 0

Thread-0 0

Thread-1 1

Thread-1 2

....

スレッドによって実装されるロジックは run で記述されますメソッドを実行するには、スレッドの start() メソッドを実行してスレッドを準備完了状態にし、CPU がリソースを割り当てるのを待ちます。

2 つのスレッドが並行して実行され、ランダムに CPU を取得していることがわかります。

2. Runnable インターフェイスと run() メソッドを実装してみました

class MyThreadimplements Runnable {

@Override

public void run() {

for (int i = 0; i

System.out.println(Thread.currentThread().getName() + " " + i);

}

}

}

public class ThreadDemo {

public static void main( String[] args) {

System.out.println(Thread.currentThread().getName());

MyThread th = new MyThread();

Thread t1 = new Thread(th);

Thread t2 = 新しいスレッド(th);

t1.start();

t2.start();

}

}

出力: main

Thread-0 0

Thread-0 1

Thread- 1 0

Thread-0 2

......

MyThread インスタンスを Thread コンストラクターに渡して Thread をインスタンス化し、Thread の start メソッドを呼び出してスレッドを開始します。

ps: Thread の継承と Runnable インターフェイスの実装の違いは何ですか?

1: 前者は単一継承であるため制限がありますが、複数のインターフェイスを実装できます。

2: 後者はリソースの共有を実現できます。

マルチスレッド プログラミングでは、Runnable

3. Callable インターフェイスと Future インターフェイスを使用してスレッドを作成することを強くお勧めします。

具体的には、Callableインターフェースの実装クラスを作成し、clam()メソッドを実装します。

そして、FutureTask クラスを使用して Callable 実装クラスのオブジェクトをラップし、この FutureTask オブジェクトを Thread オブジェクトのターゲットとして使用してスレッドを作成します。

class MyCallable は Callable を実装します {

@Override

public Integer call() throws Exception {

return 1;

}

}

public class ThreadDemo {

public static void main (String[] args) {

Callable myCallable = new MyCallable();//MyCallable

FutureTaskをインスタンス化 ft = new FutureTask(myCallable);//FutureTask

をパッケージ化

Thread thread = new Thread (ft ); // FutureTask を Thread 構造体に渡し、スレッドをインスタンス化します

Integer result = ft.get(); // 戻り値を取得します

System . out.println(result);

}

}

1) Callable インターフェースに call() メソッドを実装します。これはスレッドによって実行されるロジックです。

2) FutureTask の get() メソッドは、call() メソッドが実行されて戻り値が取得されるまでブロックされます。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaの平方根 Javaの平方根 Aug 30, 2024 pm 04:26 PM

Java の平方根のガイド。ここでは、Java で平方根がどのように機能するかを、例とそのコード実装をそれぞれ示して説明します。

Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

Java の乱数ジェネレーター Java の乱数ジェネレーター Aug 30, 2024 pm 04:27 PM

Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプ Java での日付までのタイムスタンプ Aug 30, 2024 pm 04:28 PM

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

See all articles