Javaスレッドとスレッド・プールおよび関連インタビューの質問の基礎知識

並行性と並列性は類似しているが、すなわち(マイクロコンセプト)に区別される:
パラレル:二つ以上のイベントを指す同じ時点で発生し、
並行2つの以上のイベントを指す同じ期間内に起こります。

オペレーティングシステムでは、マルチプログラミング環境では、同時実行は、プログラムの複数の時間の期間を意味するが、巨視的に同時に実行されますが、単一CPUシステムが、各時間だけプログラムの実行がある(タイムスライス)、これらのプログラムのみ顕微鏡交互に時分割で実行することができます。
コンピュータシステムのCPU、複数の場合、これらのプログラムを同時にので、こと、プログラムを処理するために、各プロセッサとタスクの多並列実行、すなわち、同時に実行することができ、複数のプロセッサに割り当てることができます実行することができますそれが微小なので、コンピュータを使用しているとき、我々は複数のプログラムを同時に実行していることを感じるので、あなたは、同時に複数のプログラムを実行することができます。
あなたは「コア」を購入し、より多くするようにコンピュータを買うときに、その理由は、「マルチコアプロセッサ」であるコンピュータは、これにより、コンピュータの動作効率を向上させること、並行して同時に複数のプログラムを処理することができます。
シングルコアプロセッサのコンピュータは確かに並行して複数のタスクを扱うことができない、複数のタスクは、単一のCPU上で同時に実行することができます。
同様に、スレッドは、スレッドが並列に実行されて理解するビューのマクロ点から、同じであるが、微視的観点から分析はそれがシリアル動作、システムは、1つのCPUだけであるときに実行するスレッドであるスレッド、スレッドです特定の順序で複数のスレッドを実行し、我々はこのような状況は、スレッドのスケジューリングと呼ばれる呼び出します。
すなわち、CPUのタイムスライスは、それぞれのプログラム(小さなコンセプト)の走行時間に割り当てられます。

IIプロセスとスレッド:
プロセスがメモリで実行されるアプリケーションです。各プロセスは、メモリ空間の独自の別個の部品を有し、アプリケーションは同時に複数のプロセスを開始することができます。たとえば、Windowsで、実行中のabc.exeはプロセスです。
ゲームをプレイし、音楽を聴きながら、我々は問題に対処することができます。この時点で、我々は二つのプログラム、ゲームをプレイ、専用の音楽に捧げ一つに設計することができます。
しかし、ここで、あなたはゾンビゲームを設計したい場合、私は完全に複数の機能にNプロセスを開く必要があり、この設計は明らかに無理があります。
ほとんどのオペレーティングシステムは、プロセス間の通信は非常に便利であることを意味しアクセスする他のプロセスのメモリ空間にプロセスを必要としない、言うまでもありません。
この時点で、我々はこの問題を解決するための「スレッド」は、この技術を導入する必要があります。
マルチスレッドソフトウェアのダウンロード:スレッドは、タスク実行処理(制御部)、同時になど、複数のスレッドを実行するプロセスを指します。
複数のプロセスを実行することができ、システムをマルチタスク、プロセスが複数のタスクを実行することができ、プロセスが複数のスレッドを含めることができます。
Aプロセスは、少なくとも一つのスレッドを持って、効率を向上させるために、あなたはプロセスで複数のタスクを開くことができます、それはマルチスレッドです。
マルチプロセス:同時に複数のプログラムを実行するためのオペレーティングシステム。
マルチスレッド:同時に同じプロセスで実行されている複数のタスクを。
私たちは、Windows環境でタスクマネージャを表示します
、オペレーティングシステムで複数のタスクを可能にする各タスクはプロセスであり、各プロセスは複数のタスクを同時に実行することができ、各タスクはスレッドです。

プロセスとスレッドとの間の差:
プロセス:別のメモリ空間、データ・ストレージ・スペース(ヒープ領域とスタック領域)プロセスは独立して、少なくとも1つのスレッドがあります。
スレッド:ヒープ領域はスタック領域が消費スレッドリソースとは独立して、共有されているが、プロセスよりも小さく、また、軽量プロセスまたはプロセス元として知られ、お互いに影響を与えることができます。
プロセス内の複数のスレッドが同時に実行されているため、微視的観点から考える連続的である、それはすべてのそのスレッドの実行CPUスケジューラ(スケジュールJVM)に依存して、プログラマが制御することはできません。
グラブのリソースに実行して来る瞬間にグラブCPUリソースへの複数のスレッド、と見られて私たちができるマルチスレッドの同時実行が、それはまた、マルチスレッドランダム性を作成しました。
プロセスJavaプログラム(システム上で実行中のJavaプログラム)は、少なくともメインスレッドとガベージコレクションスレッド(バックグラウンドスレッド)が含まれています。
スレッドのスケジューリングは:
コンピュータは通常、1つのCPUのみを持っている任意の時点で、各プロセスが唯一の命令を実行するためにCPUを使用する権利を得る唯一のコンピュータ命令を実行することができます。
同時に実行する、いわゆるマルチプロセスを、ビューのマクロ観点から、実際には、ターンGETにおける各プロセスを自分のタスクを実行するには、それぞれ、CPUを使用する権利。
そう、プールで実行することができ、CPUまで、レディ状態にある複数のスレッドがあるだろう、JVMは、スレッドのスケジューリングを担当しています。
JVMは、**、**プリエンプティブスケジューリングを使用していますノータイムシェアリングのスケジューリングは、それはマルチスレッド実行のランダムな結果を引き起こす可能性がありますすることができます。

スレッドの状態は、
新しい状態(新)を作成します。1.
2.レディ状態(Runnableを)
3.実行(状態を実行している
4.ブロックされた(ブロック)
5.死状態(デッド)の
ここに画像を挿入説明
3つの利点を超えるスレッド:
マルチスレッドをマルチとしてタスク、利点があることを、当然のことながら、方法によって複雑:
。あなたができないスレッド間で共有するプロセス間のメモリ①、および共有メモリ(ヒープメモリ)は非常に単純で
、プロセス②システムを作成するプロセスに再割り当てシステムリソースへの必要性、作成多くのスレッドは、このように、同時マルチタスクを実現する高効率化。マルチスレッド、小さな価格です
支援③Java言語自体を、内蔵のマルチスレッド機能、むしろ単に基礎となるシステムの最初のスケジューリングなどよりも、マルチスレッドプログラミングを簡素化します。

マルチスレッドダウンロード:スレッドがファイルチャネルをダウンロードすることであると理解することができ、マルチスレッドが同時に複数のチャネルをダウンロードするために開かれます。サーバーは、ダウンローダを使用してダウンロードすることができますが、帯域幅を共有している場合は、同じ優先度レベルで、全体の総サーバが均等にスレッドをダウンロードします。
理解しにくい、あなたのマルチスレッド場合は、より速くダウンロードしません。マルチスレッドをサポートするために、今、人気のダウンロードソフトウェア。
マルチスレッドは、複数のタスクを同期させるために、効率のプログラムを提供していないが、リソースの利用効率を向上させることにより、システムの効率を改善することです。
あなたはコンピュータを購入するときだから今、あなたは、CPUのスレッド数になります。

IV。Javaのコードでプロセスを実行する方法

//运行一个进程
public class ProcessDemo {
    public static void main(String[] args) throws IOException {
        //方式1:Runtime类的exec方法:
        Runtime runtime = Runtime.getRuntime();
        runtime.exec("notepad");//打开一个记事本
        //方式2:ProcessBuilder的start方法:
        ProcessBuilder pb = new ProcessBuilder("notepad");//打开一个记事本
        pb.start();
    }
}

スレッドを作成するにはV.の方法
作成①継承Threadクラス
 スレッドから継承してをし、その実行を無効に()、タスクを実行するためのスレッドですrunメソッド。後のスレッドのサブクラスを作成start()メソッドを呼び出すことによって実行することができます。
 Threadクラススレッドが達成継承することによって、複数のスレッドのスレッドクラスのインスタンス変数の間で共有することはできません。(異なるオブジェクトのスレッドを作成する必要があり、自然に共有されません)

public class ThreadTest extends Thread {
    private int i = 0;

    @Override
    public void run() {
        for (; i < 50; i++) {
          System.out.println(Thread.currentThread().getName() + " is running " + i);
        }
    }

    public static void main(String[] args) {
        for (int j = 0; j < 50; j++) {
            if (j == 20) {
                new ThreadTest().start();
            }
          System.out.println(Thread.currentThread().getName() + " is running " + j);
        }
    }
}

②のRunnableインタフェースクラスを介してスレッドを作成する
実装が実行可能インターフェースメソッド、インターフェースおよびオーバーライドrun()メソッド、メソッドが実行のスレッドを実行するクラスを定義する必要があります。オブジェクトRunnableを実装クラスを作成し、パラメータのターゲットとしてThreadオブジェクトを作成し、このスレッドのスレッドオブジェクトが実際のオブジェクトです。Threadクラスの実装のRunnableインタフェースによって、それはお互いの共有リソースです。

public class RunnableTest implements Runnable {
    private int i ;
    @Override
    public void run() {
        for(;i<50;i++){
            System.out.println(Thread.currentThread().getName() + " -- " + i);
        }
    }
    public static void main(String[] args) {
        for(int i=0;i<100;i++){
            if(i==20){
                RunnableTest runnableTest = new RunnableTest() ;
                new Thread(runnableTest,"线程1").start() ;
            }
            System.out.println(Thread.currentThread().getName() + " is running " + i);
        }
    }
}

呼び出し可能と未来がスレッド作成使用③
  Threadクラスから継承をしてRunnableを実装するには見ることができ、二つの方法上記の戻り値を持つことができない、と例外をスローすることはできません。これは、呼び出し可能な2つのインターフェイスが達成される戻り値を許容しながら、呼び出し可能などのインターフェースは、実行可能なスレッドとして()メソッドの呼び出しを提供するRunableインタフェースをアップグレード。
  呼び出し可能インターフェースは、Java 5の新しいインターフェイスではなく、サブインターフェイス、Runnableインタフェースであるので、しかし、Callableオブジェクトを直接、ターゲットThreadオブジェクトとして使用することはできません。この問題に対する解決策は、()の呼び出しの戻り値を受け入れることができる将来のインターフェースの導入に、RunnableFutureインターフェースは、サブインターフェースの今後のインターフェイスのRunnableインタフェースであり、ターゲットスレッドオブジェクトとして使用することができます。FutureTask:そして、未来のインタフェースは、実装クラスを提供します。
  FutureTaskはRunnableFutureインタフェースがターゲットスレッドオブジェクトとして使用することができる実現しました。

public class CallableTest {
    public static void main(String[] args) {
        CallableTest callableTest = new CallableTest() ;
        //因为Callable接口是函数式接口,可以使用Lambda表达式
        FutureTask<Integer> task = new FutureTask<Integer>((Callable<Integer>)()->{
            int i = 0 ;
            for(;i<100;i++){
                System.out.println(Thread.currentThread().getName() + "的循环变量i的值 :" + i);
            }
            return i;
        });
        for(int i=0;i<100;i++){
            System.out.println(Thread.currentThread().getName()+" 的循环变量i :" + i);
            if(i==20){
                new Thread(task,"有返回值的线程").start();
            }
        }
        try{
            System.out.println("子线程返回值 : " + task.get());
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

④は、例えば、スレッドプールエグゼキュータ枠用いて
最大の利点キュータフレーム1.5を提出した後に導入され、タスクを実行するデカップリングされています。人々は、単にその後、提出、はっきりタスクタスクの説明を行いたいです。これはもう気にしませんどのようにタスクが実行されるように、実行された場合に、実行者によって、提出されています。話すの具体的なポイントは、ExecutorServiceのにCallableオブジェクトを提出する(例えば、最も一般的なスレッドプールThreadPoolExecutorなど)、今後のオブジェクトを取得します、十分に得る結果を得るためにFutureオブジェクトのメソッドが待機を呼び出します。エグゼキュータインナーフレームはjava.util.cocurrentパケット内のフレームによって制御スレッドを開始れ、スレッドプールメカニズムを使用して、そして実行は並行プログラミング動作を簡略化することができる、閉じ。そのため、Java 5の後、スレッドは、(スレッドプールの実装と、コスト削減)優れた効率を管理する方が簡単除き、方法エグゼキュータを使用するよりも、より良いスタートをスレッドを開始するために、重要なポイントがあります:これは防ぐことができます質問を逃れる-私たちは、コンストラクタ内のスレッドを開始した場合、他のタスクは、コンストラクタの終了前に開始可能性があるため、この時間は、コンストラクタでエグゼキュータで初期化されたオブジェクトの半分にアクセスすることができます。

エグゼキュータのフレームワークが含まれます:スレッドプール、エグゼキュータ、エグゼキュータ、ExecutorServiceの、CompletionService 、今後、コーラブルようにしています。
この方法は、実行キュータインタフェース定義(Runnableをコマンド)は、この方法は、タスクを実行するために使用されるRunable例えば、クラスその実装のRunnableインターフェースであるタスクを受信します。ExecutorServiceのインタフェース継承豊かなマルチスレッド達成するための方法を提供する執行インターフェースから、例えば、閉鎖ExecutorServiceの独自の方法を提供し、ならびにトラック一つ以上の非同期タスクは、将来の方法を生み出します。ExecutorServiceのは、メソッドが呼び出された後、それはどんな新しいタスクを受け入れExecutorServiceの停止につながる、スムーズに近いExecutorServiceのにシャットダウン()メソッドを呼び出し、(タスクが2つのカテゴリに分類されます提出された完全に提出されたタスクの実行を待つことができます:1が既にあります実行時に、他のはまだ)の実行を開始していないが、提出されているすべてのタスクが終了したときに閉じExecutorServiceのだろう。私たちは、一般的にこのインタフェースを使用して実装し、マルチスレッドを管理します。
ExecutorServiceのライフサイクルは三つの状態が含まれます。実行して、閉じが終了しました。実行状態に入った後に作成したシャットダウン()メソッドを呼び出すときに、オフ状態になります、この時点では知られているとき、ExecutorServiceのは、もはや新しいタスクを受け入れ、それはタスクの実行に提出されていることを意味は、提出されましたタスクの実行後、彼らは最終状態に達します。あなたがシャットダウン()メソッドを呼び出していない場合は、ExecutorServiceのは、実行中の状態になって常に新しい仕事、新しいタスクを受けているだろう、サーバは一般的に、それを閉じるために直留を維持する必要はありません。
エグゼキュータはExecutorServiceのインタフェースを達成している最初のスレッドプールスレッドプールのリターンを作成するためのファクトリメソッドの範囲を提供します。
パブリック静的ExecutorServiceのnewFixedThreadPool(int型にnthreads)
スレッドの固定された数を生成するスレッドプール。
パブリック静的ExecutorServiceのnewCachedThreadPoolは、()
スレッドが利用可能な場合)を実行するために、キャッシュされたスレッドプールのスレッドの呼び出しは以前に構築を再利用します作成します。既存のスレッドが使用できない場合は、新しいスレッドが作成され、プールに追加されます。キャッシュから60秒間使用されていないこれらのスレッドを終了し、削除します。
パブリック静的ExecutorServiceのnewSingleThreadExecutor()
単一スレッドエグゼキュータを作成します。
public static ScheduledExecutorService newScheduledThreadPool(int型corePoolSize)
定期的かつ定期的なタスクの実行をサポートするために、スレッドプールを作成するには、ほとんどの場合、Timerクラスを置き換えるために使用することができます。
これらの4つの方法が確立されたスレッドThreadFactoryで使用されるエグゼキュータは、上記次の4つの方法が比較されます

newCachedThreadPool() キャッシュ型プールは、最初に何の以前に確立していないスレッドプールをチェックし、そうであれば、再利用に。、一般的にので、池の生存とのいくつかの種類を実行するために使用される短いバッファプール非同期タスクの種類に参加するために、新しいスレッドを構築されていない場合コネクション指向で数サーバーデーモンの種類が多すぎません。しかし、短期生存非同期タスクのために、それはエグゼキュータの最初の選択肢です。timeoutDLEでなければならないスレッドプール内のスレッドを再利用することができ、デフォルトのタイムアウトは長いDLEを超えて、スレッドのインスタンスが終了し、プールから削除、60年代です。CachedThreadPoolにスレッドがよりTIMEOUT非アクティブよりも、それは自動的に終了されますが、その終わりを心配する必要があること注意
newFixedThreadPool(INT) ほぼ同様newFixedThreadPoolとcacheThreadPoolはようでそれを再利用することはできますが、新しいスレッドその独自性を構築する準備ができていない:作成する新しいスレッドがある場合は、任意の時点で、唯一のアクティブなスレッドの固定数しか入れ、この時点で存在していることができます直接出異なる池とcacheThreadPool、FixedThreadPoolなしIDLE機構の現在のスレッドになるまで、キュー内の他の待機中に、スレッドを終了するには(持っているかもしれませんが、文書は言及しなかったことから、非常に長く、同様の依存上位TCまたはUDPDLEメカニズムである必要がありますなど)、いくつかの非常に非常にフォーマルな固定並行スレッドのため、そしてより多くの、見キャッシュプールとプールの固定のコールのサーバーメソッドのソースコードからFixedThreadPool最も安定したように、同じ基礎プールですが、異なるパラメータ:スレッドの固定のプール固定数、およびそれが(なしIDLE 0秒です
newScheduledThreadPool(INT) このタイプのスレッドプールスレッドプールをスケジューリングすることでスケジュールによる遅延実行、またはサイクルの実行を有効にすることができます
- -
SingleThreadExecutor() シングルスレッドの実施形態では、固定プール、プールを持つ唯一のスレッドいつでもプールと同じ基本的なプールをキャッシュするが、スレッドの数は1-1,0秒IDLE(アイドル)であります

一般的には、CachedTheadPoolは、通常、必要なスレッドの数が同じで、プログラムの実行中に作成し、それは、古いスレッドが新しいスレッドを作成し、それは、このアプローチは、問題が発生する場合にのみ、Executorのための合理的な選択である回復したときに停止します、FixedThreadPoolを検討する唯一の必要性(例えば、それは長い接続が指向のスレッドの多くを必要)。
エグゼキュータたRunnableタスクを実行
つ以上の静的ファクトリメソッドのエグゼキュータによってExecutorServiceのインスタンスを取得し、そのインスタンスのexecute(Runnableをコマンド)メソッドを呼び出しを行えます。Runnableタスクが自動的にオンにスレッド()メソッドを実行するために渡されたら

public class TestCachedThreadPool {
    public static void main(String[] args){
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < 5; i++){
            executorService.execute(new TestRunnable());
            System.out.println("************* a" + i + " *************");
        }
        executorService.shutdown();
    }
}

class TestRunnable implements Runnable{
    public void run(){
        System.out.println(Thread.currentThread().getName() + "线程被调用了。");
    }
}

VI。フェイス質問
①スレッドとプロセスの違いは何ですか?
プロセスは独立した(自己含ま)オペレーティング環境では、プログラムまたはアプリケーションとして見ることができます。スレッドは、プロセスで行われる作業です。スレッドは、プロセスが異なるタスクを実行するために、並行して各スレッドをスレッドの多くを有することができ、プロセスのサブセットです。異なる別のメモリ空間を使用するプロセス、およびすべてのスレッドが同じメモリ空間を共有しています。各スレッドは、ローカルデータを格納するために使用される別のスタックメモリを持ち、それとスタックメモリを混同しないでください。

②Threadクラス開始()とrun()メソッドの違いは何ですか?
通話開始()メソッドは、新しいスレッドを開始します。直接スレッドのrun()メソッド呼び出された場合、その動作は通常の方法と同じになります。新しいスレッドで私たちのコードを実行するには、Thread.startを(使用する必要があります)方法。

③Runnableをまたはスレッドに?
我々は、すべてあなたがスレッドを実装するためにThreadクラスや、Runnableインタフェースの呼び出しを継承することができることを知って、問題が優れている道のスレッドを作成するのですか?どのような状況下でそれを使用するには?あなたはJavaは多重継承クラスをサポートしていない知っていれば、この質問は答えるのは簡単ですが、複数のインタフェースを呼び出すことができます。あなたが他のクラスから継承したいのであれば、当然のことながら、より良い、Runnableインタフェースを呼び出すことです。

④Runnableと呼び出し可能な違いは何ですか?
Runnableを、呼び出し可能は異なるスレッドで実行されるこれらのタスクを表します。初めそこJDK1.0のRunnableから、JDK1.5で呼び出し可能に増加しました。主な違いは、Callableを呼び出し()メソッドは値を返し、例外をスローですが、Runnableをrun()メソッドは、これらの機能を持っていません。呼び出し可能な未来のオブジェクトは、計算結果をロードし戻してもよいです。

⑤エグゼキュータのフレームワークとは何ですか?
ExecutorのフレームワークはJava 5で導入された、エグゼキュータのフレームワークは、非同期タスクの実行ポリシーの呼び出し、スケジューリング、実行および制御のセットに基づくフレームワークです。
無制限のスレッドを作成すると、スレッドの数を制限することができ、これらのスレッドを再利用することができますのでので、スレッドプールは、よりよい解決策で作成し、アプリケーションのメモリオーバーフローを引き起こす可能性があります。あなたは非常に簡単にエグゼキュータのフレームワークを使用してスレッドプールを作成することができます。

何⑥Executorsクラスですか?
執行は、ツールの方法れたExecutor、ExecutorService、ScheduledExecutorService、ThreadFactory、呼び出し可能なクラスを提供します。執行は簡単にスレッドプールを作成するために使用することができます。

公開された99元の記事 ウォンの賞賛2 ビュー2619

おすすめ

転載: blog.csdn.net/weixin_41588751/article/details/105104603