Java学習のマルチスレッド編

6070 ワード

0 x 00はじめに
1つのツール開発では,同じ動作やリクエストを継続的に実行する必要がある場合,単一スレッドの使用は非常に遅い.やはり1つのディレクトリスキャナーを例に挙げます.例えば、ディレクトリスキャナーを開発する必要があります.私たちの辞書には10000の辞書があります.httpの要求を開始するには、1つのスレッドしかありません.このような速度は非常に遅いですが、マルチスレッド、4つのスレッドを使用して、スレッドごとに2500の辞書を要求すれば、私たちが費やした時間を4倍に短縮することができます.
0 x 01マルチスレッド概念
スレッドとプロセス
マルチスレッドを理解する前に、まずマルチスレッドとマルチプロセスの違いを明らかにします.
≪プロセス|Process|emdw≫:指定したメモリ・ブロックでプログラムが実行されます.1つのプログラムで複数のプロセスを同時に実行できます.
スレッド:スレッドはプロセス内の実行ユニットであり、現在のプログラムの実行を担当し、1つのプロセスには少なくとも1つのスレッドがあります.
1つのプログラムは実行され、少なくとも1つのプロセスがあり、1つのプロセスは複数のスレッドを開くことができます.我々の開発では,一般にマルチスレッドを用いて開発される.
スレッドスケジューリング
タイムシェアリングスケジューリング:スレッドを使用してcpuの使用権を順番に使用し、各スレッドにcpu時間を平均的に割り当てる.
プリエンプトスケジューラ:優先度の高いスレッドにcpuを使用させることは限られており、スレッドの優先度が同等であればランダムに1つのスレッドを選択して実行され、javaではデフォルトでプリエンプトスレッドスケジューリングが行われます.
0 x 02マルチスレッドプログラミング
JavaではThreadを使用してマルチスレッドプログラムを作成できます.すべてのスレッドオブジェクトはThreadクラスまたはそのサブクラスのインスタンスでなければなりません.
まず、彼の構造方法を見てみましょう.
public Thread() :          。
public Thread(String name) :               。
public Thread(Runnable target) :                。
public Thread(Runnable target,String name) :                     

使用方法:
1.サブクラス継承Threadを定義し、runメソッドを書き換えます.runメソッドのメソッドボディは、スレッドが完了する必要があるタスクを表します.2.サブクラスオブジェクトをインスタンス化しstartメソッドを呼び出す
public class Demo11 extends Thread{
    @Override
    public void run() {
        System.out.println("     ");
    }
}


threadのサブクラスを作成しrunメソッドを書き換えます.
public static void main(String[] args)  {

        Demo11 thread = new Demo11();
        thread.start();
        System.out.println("     ");
    }

実装クラスオブジェクトをインスタンス化し、startを使用してサブスレッドの起動を行います.
Runnableマルチスレッドの作成
Runableインタフェースを実現することで,クラスにマルチスレッドの特徴を持たせる.run()メソッドにはマルチスレッドで実行するコードが含まれています.Threadは実際にrunnableインタフェースの中のクラスを実現しています.すべてのマルチスレッドでは実際にはThreadというクラスがスレッドを操作しています.
手順:
まずRunnableの実装クラスを作成し、runメソッドを書き換え、Threadクラスインスタンス化オブジェクトを使用してrunnableインスタンス化オブジェクトを渡し、threadのインスタンス化オブジェクト呼び出しstartメソッドを使用してスレッドを作成します.
コード:
runnable   :

public class Demo11 implements Runnable{
    @Override
    public void run() {
        System.out.println("     ");
    }
}

main    :

public static void main(String[] args)  {

        Demo11 run = new Demo11();
        Thread thread = new Thread(run);
        thread.start();
        System.out.println("     ");
    }

どちらの方式でもマルチスレッドを実現できるが,第1の方法を用いると,リソースの共有に適しておらずrunableという方式では,リソースの共有が容易に実現できる.
Runnableインタフェースのメリット:
1.                       。
2.     java         。
3.         ,      ,           ,       。
4.          Runable Callable   ,        Thread  。

匿名内部クラスマルチスレッドの作成
スレッドを作成するたびに、実装クラスを作成し、実装クラスをインスタンス化して呼び出します.一方、threadのstrartメソッドは1回しか呼び出せないので、匿名の内部クラスを使用して定義することができます.
public static void main(String[] args)  {

        Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.println("     ");
            }
        };
        new Thread(r).start();

        System.out.println("     ");
    }


0 x 03スレッドセキュリティ
複数のスレッドが同時に実行され、ある変数を操作している場合、新しい問題が発生します.私たちはやはり1つのディレクトリスキャナーを持って例を挙げて、もし私たちの辞書の中に100の辞書があって、複数のスレッドを開いてスキャンする必要があるならば、その時私たちは、直接彼に要求を開始させて、それではこれらのスレッドはすべて同じ辞書を読んで5回読んで、マルチスレッドが分業協力の1つの効果を果たすことができません.
この場合、同期メカニズムまたはスレッドロックを使用してこの問題を解決することができます.
同期コードブロック
同期コードブロック:synchronizedキーワードは、このブロックのリソースに反発することを示すメソッド内のブロックに使用できます.
書式:
synchronized(   ){
         
}

同期ロックは、オブジェクトにロックをマークする概念にすぎません.
ロックされたオブジェクトは任意のタイプですが、スレッドオブジェクトは同じロックを使用します.
    :

package cn.itcast;

public class Demo11 implements Runnable{
    private int num = 100;
    private boolean flag = true;
    Object obj = new Object();

    @Override
    public void run() {
        while (flag){
            synchronized (obj){
                if (num==0){
                    flag = false;
                }else {
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    System.out.println("     "+Thread.currentThread()+"  "+num--);
                }

                }
            }
        }

    }


main  :

public class DemoMain {
    public static void main(String[] args) {
        Demo11 r = new Demo11();
        new Thread(r).start();
        new Thread(r).start();
        new Thread(r).start();
        new Thread(r).start();
        new Thread(r).start();

    }
}


ロック同期ロック
ロックメカニズムはsynchronizedコードブロック法よりも広い.
一般的な方法:
public void lock()  :    
public void unlock():    

コードの例:
package cn.itcast;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Demo11 implements Runnable {
    private int num = 100;
    private boolean flag = true;
    Lock lock = new ReentrantLock();



    @Override
    public void run() {

        while (flag) {
            lock.lock();
            if (num == 0) {
                flag = false;
            } else {
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("     " + Thread.currentThread() + "  " + num--);
            }
            lock.unlock();


        }
    }
}

mian  :

public class DemoMain {
    public static void main(String[] args) {
        Demo11 r = new Demo11();
        new Thread(r).start();
        new Thread(r).start();
        new Thread(r).start();
        new Thread(r).start();
        new Thread(r).start();

    }
}


0 x 04エンド
マルチスレッドは、ツールを開発する際によく使用されます.一部のツールでは、効率を向上させる必要があります.そうしないと、効率が低下します.後でスレッドをカスタマイズできるプログラムを開発して、ユーザーが何個のスレッドを入力して、匿名の内部クラスnewを直接使用して何個のthreadオブジェクトを使用することができて、このように直接実現しました.