マルチスレッドの単純な定義!

それは次の工程のためにすべての最初の1を、スレッドになると、次のようにプロセスの定義は次のとおりです。

プロセス構造は、基礎となるオペレーティング・システムであり、プログラムの実行で、リソース割当システムであって、データセット上で実行中のプロセス、プログラム、およびデータ構造を順次処理エンジン上で実行されるときに発生する、活性であり、そしてスケジューリングの別のユニット。

簡単に言えばexeファイルタスクマネージャリストは、QQ.exeとして、プロセスとして理解することができるプロセスである、プロセスは、システム管理によって実行基本単位です。

1.1スレッドとは何ですか?

スレッド、プロセス、単位工程の実際の動作に含まれる動作スケジュール、可能なオペレーティングシステムの最小単位です。

簡単に言えば、スレッド、プロセスで実行されている別のサブタスクとして理解することができます。例えば、QQ.exeが同時に実行されているサブタスクがたくさんある実行しています。

1.2プロセスとスレッドとの間の差に

1.2.1スケジュール:独自のリソースの基本単位として、スレッドのスケジューリングおよび割り当てプロセスの基本単位として。

並行1.2.2:だけでなく、プロセス間で同じプロセスで複数のスレッド間で同時に実行することができるが、また同時に実行することができます。

、プロセスは、リソースを持つ独立したユニットであり、スレッド自体は本質的に、システムリソースを持っていない(例えば、プログラム・カウンタとして、レジスタ、スタックのセット)を必須リソースの操作に少しだけを有し、それは缶:1.2.3リソースを持っています他のスレッドとプロセスを共有するすべてのリソースが所有するプロセスに属しています。プロセス間で共有アドレス空間ではなく、スレッドは、プロセスが共有アドレススペースです。

1.2.4オーバーヘッド:あなたが作成したり、システムが再計算され、資源回復しなければならないので、プロセスを元に戻す場合は、システムのオーバーヘッドにつながることと、スレッドの作成や、失効のコストよりもかなり大きいです。

1.3マルチスレッドとは何ですか?

マルチスレッドの単純な定義

 

マルチスレッドは、事実上、複数のスレッドを同時に実行しています。

1.4なぜマルチスレッドを使用します

1.4.1使用してスレッドがに対処するためにバックグラウンドタスクにプログラムの中で長い時間を占めることができます。

より魅力1.4.2ユーザーインターフェイスは、とても例えば、ユーザーが何か片の処理をトリガーするボタンをクリックすると、あなたは、プロセスの進行状況を表示するプログレスバーを開くことができます。

プログラムの1.4.3運転効率を向上させることができました。

このようなユーザ入力を達成するために、待機しているファイルの読み取りおよびネットワークデータを送受信するなど、いくつかのタスク、オン1.4.4は、スレッドがより有用です。

状態2スレッド

一般的に、これらのスレッドは、次の状態のものがあります(死んで)死んで、待って、TIMED_WAITINGを(新)、レディ(実行可能)、(ランニング)を実行し、閉塞(ブロック)を作成します。

マルチスレッドの単純な定義

 

3-ねじ切り使用より

3.1 Threadクラスの継承

マルチスレッドの単純な定義

 

プログラムは、交互に行うに見られるが、最終的に98に実装することができます。

3.2 Runnableを実装

マルチスレッドの単純な定義

 

あなたはまだ別のプログラムの実行中に見られることが、最終的に98に実装することができます。

3.3呼び出し可能インターフェースの実装を継承します

マルチスレッドの単純な定義

 

後にスレッドプールを更新し、あなたは、呼び出し()メソッドを書き換える必要があります呼び出し可能インターフェースを達成し、FutureTaskクラスを使用するには、まずここでは説明しない、というようにして、詳細に入ることに留意すべきです。

例えば、スレッドプール3.4エグゼキュータのフレームワークを使用して

このセクションでは、一時的に記述しています。戻ると、更新スレッドプールエグゼキュータを詳細に説明します。

4マルチスレッド一定の速いを使用しますか?

:必ずしも、マルチスレッドコンテキストスイッチのオーバーヘッドのコンテキストスイッチがもたらすので。

4.1コンテキストスイッチとは何ですか?

シングルコアCPUのために、CPUは時間だけスレッドに1つ、別のスレッドを実行するスレッドの動作中にトランジットを実行することができ、これは、(プロセスは類似しているため)、スレッドコンテキストスイッチと呼ばれます。スレッドコンテキストスイッチングプロセスは、プログラムカウンタ、CPUレジスタの状態および他のデータを記録します。

4.2どのようにコンテキストスイッチを軽減するには?

4.2.1スレッドの数を減らします

各時間は、CPUが一つだけのスレッドを実行することができますので、ふざけて私たちはプログラムを同時に実行したい、オペレーティングシステムのコンテキストスイッチは、感覚プログラムはラインの同時実行であるから、私たちが感じるように常に持っていました。したがって、限り、我々は、スレッドの数を減らすように、コンテキストスイッチの数を減らすことができます。

スレッドの数は、CPUあたりのCPUコアの数よりも少なくなっている場合は、スレッドが合理的なCPUコンテキストの切り替えが必要とされていないだろう実行されますが、そうではありません。

4.2.2ロックされたスレッドの同じ数を制御します

複数のスレッドが同じロックを共有している場合、スレッドはロックを取得するとき、他のスレッドがブロックされます。このスレッドがロックを解除する場合、コンテキストスイッチが表示されるように、オペレーティング・システムは、選択されたスレッドがブロックされている行います。

したがって、同じロックのスレッドの数を減らすこともコンテキストスイッチの数を減らすことができます。

ロックフリー並行プログラミングの使用を4.2.3

タスクの同時実行がステートレスである必要があります:HASHセグメントを

所谓无状态是指并发执行的任务没有共享变量,他们都独立执行。对于这种类型的任务可以按照ID进行HASH分段,每段用一条线程去执行。

需要并发执行的任务是有状态的:CAS算法

如果任务需要修改共享变量,那么必须要控制线程的执行顺序,否则会出现安全性问题。你可以给任务加锁,保证任务的原子性与可见性,但这会引起阻塞,从而发生上下文切换;为了避免上下文切换,你可以使用CAS算法, 仅在线程内部需要更新共享变量时使用CAS算法来更新,这种方式不会阻塞线程,并保证更新过程的安全性。

5 使用多线程的缺点:

5.1 上下文切换的开销

当 CPU 从执行一个线程切换到执行另外一个线程的时候,它需要先存储当前线程的本地的数据,程序指针等,然后载入另一个线程的本地数据,程序指针等,最后才开始执行。这种切换称为“上下文切换”。CPU 会在一个上下文中执行一个线程,然后切换到另外一个上下文中执行另外一个线程。上下文切换并不廉价。如果没有必要,应该减少上下文切换的发生。

5.2 增加资源消耗

线程在运行的时候需要从计算机里面得到一些资源。 除了 CPU,线程还需要一些 内存来维持它本地的堆栈。它也需要 占用操作系统中一些资源来管理线程。

5.3 编程更复杂

在多线程访问共享数据的时候,要考虑 线程安全问题 。6 线程安全

6.1 线程安全定义

一个类在可以被多个线程安全调用时就是线程安全的。

6.2 线程安全分类

线程安全不是一个非真即假的命题,可以将共享数据按照安全程度的强弱顺序分成以下五类:

不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。

6.2.1. 不可变

不可变(Immutable)的对象一定是线程安全的,无论是对象的方法实现还是方法的调用者,都不需要再采取任何的线程安全保障措施,只要一个不可变的对象被正确地构建出来,那其外部的可见状态永远也不会改变,永远也不会看到它在多个线程之中处于不一致的状态。

タイプ不変:最終キーワード改変基本データ型、文字列、列挙型、数部分は、Double値とロング包装の他のタイプ、BigIntegerのBigDecimalのおよび他の大規模なデータ・タイプとしてサブクラス。しかし、サブアトミックとのAtomicInteger AtomicLong同じタイプの数は不変ではありません。

6.2.2絶対スレッドの安全性

かかわらず、ランタイム環境の、呼び出し側は、任意の追加の同期の措置を必要としません。

6.2.3相対スレッドセーフ

呼び出しは、追加の安全措置を行う必要はありませんが、連続通話いくつかの特定の順序のために、あなたが終了する呼び出しを同期させるために追加的な手段を使用する必要がありますとき、別のこのオブジェクトは、スレッドセーフであることを確認する必要があります上の相対的なスレッドセーフな操作コールの正確さを保証します。

6.2.4互換性のあるスレッド

スレッド互換オブジェクト自体はスレッドセーフではありませんが、同期オブジェクトを確保するための手段の適切な使用を呼び出すことによって終了することを意味し、安全に同時実行環境で使用することができ、我々は通常、クラスはスレッドセーフではないことを言って、時間の手段のほとんどこれは状況です。JavaのAPIクラスの大部分は、以前の対応するベクトルとHashTableコレクションクラスのArrayList HashMapのなど、スレッドと互換性のあります。

6.2.5スレッド敵対

スレッド敵対的に関係なく、マルチスレッド環境で同時に使用することができない同期が措置を講じているかどうかの端を呼び出すコードを指します。マルチスレッドの特性を持って生まれJava言語ので、このマルチスレッドコードのスレッド敵対的な拒否は稀であり、そしてしばしば有害であり、避けるべきです。

最後に、小扁は、分散マイクロサービスのビットを終え、パフォーマンスの最適化、ビデオ、およびデータ春、とMyBatisの知識の他のソースを記録します!そして、インタビューの質問や情報ああ、さまざまな!

 

あなたが受け取ることができ、スカート772300343必要性を追加してください!

 

おすすめ

転載: www.cnblogs.com/sevencutekk/p/11511701.html