ホームページ > Java > &#&はじめる > Javaマルチスレッドの作成と起動

Javaマルチスレッドの作成と起動

王林
リリース: 2020-04-15 16:16:33
転載
2245 人が閲覧しました

Javaマルチスレッドの作成と起動

Java でのスレッドの作成は、次の 3 つの基本形式で一般的です:

1. Thread クラスを継承し、このクラスの run() メソッドをオーバーライドします。

Thread クラスを継承し、このクラスの run() メソッドをオーバーライドします

public class MyThread extends Thread{
    @Override
    public void run() {
        for (int i = 0 ;i < 50;i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }
    public static void main(String[] args) {
        for (int i = 0;i<50;i++) {
            //调用Thread类的currentThread()方法获取当前线程
            System.out.println(Thread.currentThread().getName() + " " + i);
            if (i == 10) {
                new MyThread().start();
                new MyThread().start(); 
            }
        }
    }
}
ログイン後にコピー

実行結果:

...
main 48
main 49
Thread-0:0
Thread-0:1
Thread-0:2
Thread-0:3
Thread-0:4
Thread-1:0
...
ログイン後にコピー

結果からわかります:

1. 3 つのスレッドがあります: main、Thread-0、Thread-1;

2. 2 つのスレッド Thread-0 と Thread によって出力されるメンバー変数 i の値-1 は連続ではありません (ここではローカル変数ではなくインスタンス変数です)。理由: Thread クラスを継承してマルチスレッドを実装する場合、各スレッドの作成には異なるサブクラス オブジェクトの作成が必要となり、その結果、2 つのスレッド Thread-0 と Thread-1 がメンバー変数 i を共有できなくなります。

##3, スレッドの実行はプリエンプティブであり、Thread-0 または Thread-1 が常に CPU を占有するとは限りません (これはスレッドの優先順位にも関係します。ここでは、Thread-0 と Thread-1 1 は同じスレッド優先度を持っています。スレッド優先度に関する知識はここでは入手できません。展開)

(学習ビデオの推奨:

java ビデオ チュートリアル )

2. Runnable インターフェイスを実装してスレッド クラスを作成する

Runnable インターフェイスを実装するクラスを定義し、このクラスのインスタンス オブジェクト obj を作成し、obj をコンストラクター パラメーターとして Thread クラスのインスタンス オブジェクトに渡します。 object は実際のスレッド オブジェクトです。

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        for (int i = 0 ;i < 50 ;i++) {
            System.out.println(Thread.currentThread().getName()+":" +i);
        }
    }

    public static void main(String[] args) {
       for (int i = 0;i < 50;i++) {
            System.out.println(Thread.currentThread().getName() + ":" +i);
            if (i == 10) {
                MyRunnable myRunnable = new MyRunnable();
                new Thread(myRunnable).start();
                new Thread(myRunnable).start();
            }
        }
        //java8 labdam方式
         new Thread(() -> {
            System.out.println(Thread.currentThread().getName());
        },"线程3").start();
    }
}
ログイン後にコピー

実行結果:

...
main:46
main:47
main:48
main:49
Thread-0:28
Thread-0:29
Thread-0:30
Thread-1:30
...
ログイン後にコピー

1. スレッド 1 とスレッド 2 が出力するメンバー変数 i は連続しているため、このようにスレッドを作成することで、複数のスレッドでスレッド クラスを共有できます。インスタンス変数。ここでは複数のスレッドが同じターゲット インスタンス変数を使用するためです。ただし、上記のコードを実行すると、実際には結果が連続していないことがわかります。これは、複数のスレッドが同じリソースにアクセスするときに、リソースがロックされていないと、スレッドの安全性の問題が発生するためです。

2. Java8 ではラムダメソッドを使用してマルチスレッドを作成できます。

3. Callable インターフェイスと Future インターフェイスを介してスレッドを作成する

Callable インターフェイス実装クラスを作成し、スレッドの実行本体として機能する call() メソッドを実装します。メソッドには戻り値があり、Callable 実装クラスのインスタンスを作成します。FutureTask クラスを使用して Callable オブジェクトをラップし、Callable オブジェクトの call() メソッドの戻り値をカプセル化します。FutureTask オブジェクトを使用します。新しい Thread を作成して開始するには Thread オブジェクトのターゲットとして指定し、子スレッドの実行終了後に FutureTask オブジェクトの get() メソッドを呼び出して戻り値を取得します。

public class MyCallable implements Callable<Integer> {
    private int i = 0;
    @Override
    public Integer call() throws Exception {
        int sum = 0;
        for (; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + " " + i);
            sum += i;
        }
        return sum;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 创建MyCallable对象
        Callable<Integer> myCallable = new MyCallable();
        //使用FutureTask来包装MyCallable对象
        FutureTask<Integer> ft = new FutureTask<Integer>(myCallable);
        for (int i = 0;i<50;i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
            if (i == 30) {
                Thread thread = new Thread(ft);
                thread.start();
            }
        }
        System.out.println("主线程for循环执行完毕..");
        Integer integer = ft.get();
        System.out.println("sum = "+ integer);
    }
}
ログイン後にコピー
call() メソッドの戻り値の型は、FutureTask オブジェクトの作成時の <> の型と一致します。

関連チュートリアルの推奨事項:

Java クイック スタート

以上がJavaマルチスレッドの作成と起動の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート