Javaの - のJava SE - マルチスレッド

マルチスレッド

作成には3つの方法をマルチスレッド:

  1. Threadクラスを継承し、runメソッドをオーバーライドします。
  2. Runnableを実装します。
  3. 呼び出し可能インターフェースを実装します。JDK 1.5が出ている、より複雑なコードを書くためにこの方法を比較してください。

モード1と差の2:

  1. 、機能使用の一般的なクラスを強化するために、継承された書き換えやメソッドを追加拡張します。
  2. 実装のインターフェイスを実装することです。
  3. 単一および複数の継承の実装。

Threadクラスのソースコード解析

公式文書から得ました:

  • JVMのサポートマルチスレッド。
  • スレッドが優先されます。あなたがスレッドでスレッドオブジェクト、現在のスレッドの優先順位と同じ、新しいオブジェクトを作成すると、スレッドがデーモンスレッドである場合にのみ、新しいスレッドオブジェクトがデーモンスレッドすることができます。
  • スレッドを作成する方法:Threadクラスの継承、Runnableを実装します。
//继承 Thread 类
class PrimeThread extends Thread {
    long minPrime;
    PrimeThread(long minPrime) {
        this.minPrime = minPrime;
    }

    public void run() {
        // compute primes larger than minPrime
        . . .
    }
}

//给出调用方法
PrimeThread p = new PrimeThread(143);
p.start();
//实现 Runnable 接口
class PrimeRun implements Runnable {
    long minPrime;
    PrimeRun(long minPrime) {
        this.minPrime = minPrime;
    }

    public void run() {
        // compute primes larger than minPrime
        . . .
    }
}

//给出调用方法
PrimeRun p = new PrimeRun(143);
new Thread(p).start();

あなたは、サブクラスオブジェクトは、メソッドを直接呼び出され起動することができ、一方は直接Threadクラスのサブクラスオブジェクト継承を作成し、スレッドを作成するための2つの方法の間、ソースコードレベル差から見ることができ、他方が別のスレッドクラスのコンストラクタを使用することで、通過しますオブジェクトは、実装のRunnableインタフェースオブジェクトそのクラスです。

Thread.State - スレッド内部列挙型クラス

スレッドクラス、すなわち6つの状態の合計スレッド、ソースコードから見ることができます。

public enum State {
    //A thread that has not yet started is in this state. 
    //新建,刚刚 new 出来,还没有调用 start 方法
    NEW,
    
    //A thread executing in the Java virtual machine is in this state. 
    //线程在虚拟机中正在运行
    RUNNABLE,
    
    //A thread that is blocked waiting for a monitor lock is in this state.
    //被锁住了
    BLOCKED,
    
    //A thread that is waiting indefinitely for another thread to perform a particular action is in this state. 
    //处于等待状态
    WAITING,
    
    //A thread that is waiting for another thread to perform an action for up to a specified waiting time is in this state.
    //确定时间的等待状态
    TIMED_WAITING,
    
    //A thread that has exited is in this state. 
    //线程已经退出,即终结了
    TERMINATED;
}

興味のある学生は、ソースを見て行くことができます。

同期

同期の単純な解釈

あなたはこの原則のブログを参照することができhttps://www.cnblogs.com/paddix/p/5367116.htmlを家のように、この時、monitorenterコマンドを呼び出し、メソッド呼び出しの変更を同期したときにObjectクラスは、暗黙のモニターを持っています、ドア施錠保管室は、メソッドを同期化され、このロックは非常に失礼な方法で、業界ヘビー級ロックは語りました。この引数はほとんど並行プログラミングにロックするこの手段を使用していないだけで一緒にロックプットの方法同期方法の多くは、妨げコール他の方法を選択し、理解しやすいです。

その最後の3つの方法は、Objectクラスのメソッド、手段があるので、これらの三つの方法は、同期メソッドまたはコードのブロックでの変更を必要とする使用し、ObjectクラスはのnotifyAllを通知し、待機方法も効果を監視するために必要とするすべてのJavaの世界このオブジェクトは、三つの方法があります。

試験:異なるスレッドと同じオブジェクトの非同期メソッドから同期メソッド呼び出し

public class SynchronizedTest01 {

    public static void main(String[] args) {
        Print print = new Print();
        new Thread(() -> {
            print.printA();
        }, "A").start();

        new Thread(() -> {
            print.printB();
        }, "B").start();


        try { TimeUnit.SECONDS.sleep(4); } catch (InterruptedException e) { e.printStackTrace(); }

        new Thread(() -> {
            print.printA();
        }, "A").start();

        new Thread(() -> {
            print.printX();
        }, "X").start();
    }
}

class Print {
    synchronized void printA() {
        System.out.println("我是 " + Thread.currentThread().getName() + " 线程,我已经调用了 printA() ,但是我要休息 3s");
        try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); }
        System.out.println("A");
    }

    synchronized void printB() {
        System.out.println("我是 " + Thread.currentThread().getName() + " 线程,我等了 A 线程 3s ,这货终于好了,我赶紧打印");
        System.out.println("B");
    }

    void printX() {
        try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }
        System.out.println("我是 " + Thread.currentThread().getName() + " 线程,我看 A 线程要休息 3s ,我休息 1s 后赶紧打印");
        System.out.println("X");
    }
}

出力:コンテンツ制御コードと出力を十分に理解することができます。

我是 A 线程,我已经调用了 printA() ,但是我要休息 3s
A
我是 B 线程,我等了 A 线程 3s ,这货终于好了,我赶紧打印
B
我是 A 线程,我已经调用了 printA() ,但是我要休息 3s
我是 X 线程,我看 A 线程要休息 3s ,我休息 1s 后赶紧打印
X
A

結論:同一のオブジェクトは、同期メソッドInvoke、非同期メソッドはそのように限定されないことはできません。

おすすめ

転載: www.cnblogs.com/chenxianbin/p/12132104.html