ホームページ  >  記事  >  Java  >  Java -- マルチスレッド

Java -- マルチスレッド

高洛峰
高洛峰オリジナル
2016-11-21 11:09:071927ブラウズ

マルチスレッド実装方法:

Threadクラスを継承

Runnableクラスを実装

----------------------------- --- --------------------------------------------------- --- ----

1. Threadクラスを継承する

Threadクラスを継承したら、親クラスのpublic void run()メソッドをスレッドのmainメソッドとしてオーバーライドする必要があります。

すべてのスレッドの実行は同時である必要があります。つまり、複数のスレッドが同じ期間に交互に実行されます。この目的を達成するには、run() メソッドを直接呼び出すのではなく、Thread クラスの start() メソッドを呼び出して複数のスレッドを開始する必要があります。

start()メソッドの呼び出しとrun()メソッドの呼び出しの比較:

public class MyThread extends Thread {
    private String name;
    public MyThread(String name) {
        this.name = name;
    }
    
    @Override
    public void run() {
        for(int i=0; i<10; i++) {
        System.out.println(name + "打印:" + i);
        }
    }
    
    public static void main(String[] args) {
        MyThread mt1 = new MyThread("线程A");
        MyThread mt2 = new MyThread("线程B");
        MyThread mt3 = new MyThread("线程C");
        mt1.start();
        mt2.start();
        mt3.start();
    }
}

実行結果: (3つのスレッドが同時に交互に実行され、実行順序は固定されません)

Java -- マルチスレッド

public class MyThread extends Thread {
    private String name;
    public MyThread(String name) {
        this.name = name;
    }
    
    @Override
    public void run() {
        for(int i=0; i<5; i++) {
        System.out.println(name + "打印:" + i);
        }
    }
    
    public static void main(String[] args) {
        MyThread mt1 = new MyThread("线程A");
        MyThread mt2 = new MyThread("线程B");
        MyThread mt3 = new MyThread("线程C");
        mt1.run();
        mt2.run();
        mt3.run();
    }
}

実行結果: ( 3つのプログラムを順番に実行します)

Java -- マルチスレッド

2. start()メソッドはマルチスレッドの原理を実装します

Threadクラスのソースコードのstart()メソッド部分を開きます:

public synchronized void start() {
        if (threadStatus != 0)
            throw new IllegalThreadStateException();
        group.add(this);
        boolean started = false;
        try {
            start0();
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
            }
        }
}
private native void start0();

ネイティブキーワードはオペレーティング システムを呼び出すメソッド。start0 () メソッドはオペレーティング システムのメソッドです。

スレッドの起動にはオペレーティングシステム内のリソースの割り当てが含まれるため、特定のスレッドの起動はオペレーティングシステムごとに異なる方法で実装される必要があります。 JVM は、さまざまなオペレーティング システムで定義されている start0() メソッドに従ってさまざまな実装を実装します。このように、start0() メソッドの名前はマルチスレッド レベルで変更されず、オペレーティング システムが異なれば実装も異なります。

Java -- マルチスレッド

概略図

結論: Thread クラスの start() メソッドのみがオペレーティング システム リソースを割り当てることができるため、マルチスレッドを開始する方法は常に Thread クラスの start() メソッドです。


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