ホームページ  >  記事  >  Java  >  Javaでマルチスレッドを作成するにはどうすればよいですか? (詳細)

Javaでマルチスレッドを作成するにはどうすればよいですか? (詳細)

不言
不言オリジナル
2018-09-25 15:32:011620ブラウズ

この記事の内容は、Java でマルチスレッドを作成する方法についてです。 (詳細)、必要な友人が参考になれば幸いです。

スレッドとは:

スレッドは、システムによって個別にスケジュールされディスパッチされる基本単位です。システムリソースを所有するのではなく、動作中に不可欠なリソースのみを所有しますが、プロセスが所有するすべてのリソースを同じプロセスに属する他のスレッドと共有できます。

表面上は、マルチスレッドですが、実際には CPU が交互に高速に実行されます。

##マルチスレッド (並列および同時実行)

  1. 並列: 2 つのタスクが 1 つの時点で実行されます。同時に、つまり、タスク A の実行中にタスク B も実行されます (マルチコアが必要)

  2. 同時実行性: 両方のタスクの実行が要求され、プロセッサーは受け入れることしかできません。 1 つのタスクなので、2 つのタスクが順番に実行されるようにスケジュールされます。時間間隔が非常に短いため、両方のタスクが実行されているように感じられます。

マルチスレッド (Java プログラム実行の原理)

Java コマンドは、 jvm を開始します。これは、アプリケーション (プロセス) を開始するのと同じです。プロセスは自動的に「メイン スレッド」を開始し、メイン スレッドはメイン メソッドを呼び出します。


JVM の開始はシングルスレッドですか?

いいえ、マルチスレッドです。少なくともガベージ コレクション スレッドとメイン スレッドが開始されます


メイン スレッドとガベージ コレクション スレッドが互いにリソースを求めて競合していることは、次のコードによって確認できます

public class TestThread {

    public static void main(String[] args) {
        //4.创建Thread的子类对象
        MyThread myThread = new MyThread();

        //5.启动线程,注意这里使用的是start而不是run方法
        myThread.start();

        for (int i = 0; i < 10000; i ++) {
            System.out.println("This is main thread");
        }
    }


}

//1.继承Thread
class MyThread extends  Thread{

    //2.重写run方法
    @Override
    public void run() {
        super.run();
        //3.线程方法中要执行的代码,可以根据自己的需求填写
        for(int i = 0 ; i < 10000 ; i ++ ) {
            System.out.println("This is MyThread thread ");
        }
    }
}

Java でマルチスレッドを作成する方法

(1) Thread クラスを継承し、start メソッドを呼び出す

Thread は Runnable インターフェイスを実装します

マルチスレッドを実装するには、スレッドのサブクラスになり、run メソッドをオーバーライドする必要があります。スレッドを開始するとき、呼び出されるのは run メソッドではなく start メソッドであることに注意してください。 run メソッドが呼び出された場合、通常のメソッドと同等であり、スレッドはオープンされません

public class Thread implements Runnable
public class TestThread {

    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        //注意这里使用的是start而不是run方法
        myThread.start();

        for (int i = 0; i < 10000; i ++) {
            System.out.println("This is main thread");
        }
    }
}
class MyThread extends  Thread{
    @Override
    public void run() {
        super.run();

        for(int i = 0 ; i < 10000 ; i ++ ) {
            System.out.println("This is MyThread thread ");
        }
    }
}

(2) runnable インターフェイスを実装し、run メソッドを書き換えます

メソッドは 1 つだけですRunnable では、run()、スレッド起動メソッドは Thread に存在します。

そして、最終的にスレッドを起動するときは、Thread のサブクラス オブジェクトを通じてスレッドを起動する必要があります。

public class TestRunnable {

    public static void main(String[] args) {
        //4.创建Thread的子类对象
        Runnable myRunnable = new MyRunnable();

        //5.启动线程,创建Thread并把runnable的子类作为构造参数
        new Thread(myRunnable).start();

        for (int i = 0; i < 10000; i ++) {
            System.out.println("This is main thread");
        }
    }

}
//1.实现runnable接口
class MyRunnable implements Runnable {

    //2.重写run方法
    @Override
    public void run() {
        //3.线程方法中要执行的代码,可以根据自己的需求填写
        for(int i = 0 ; i < 10000 ; i ++ ) {
            System.out.println("This is MyRunnable thread ");
        }
    }
}

Callable インターフェイスを実装します

スレッドを実装するには、スレッドと実行可能ファイルの継承に加えて、Callable インターフェイスを実装することもできます。 Callable インターフェイスは、スレッドの実行本体として使用できる call() メソッドを提供します。このメソッドは run() と同じ機能を持ちます。ただし、call() メソッドは run() メソッドよりも多くの戻り値を持ち、call() メソッドはスローされる例外を宣言できます。では、Callable スレッドを開始するにはどうすればよいでしょうか? Callable インターフェイスは Runnable インターフェイスのサブインターフェイスではないため、Callable オブジェクトを Thread の構築パラメータとして使用することはできません。 Java には、Runnable、Future を実装するもう 1 つのインターフェイスである RunnableFuture インターフェイスが用意されています。

  1. implementation

    Callableinterface

  2. call メソッド。スレッドの run メソッドと同等です。違いは、call メソッドで戻り値が許可されることです。

  3. # Callable 実装クラス オブジェクトを構築パラメータとして FutureTask に渡し、FutureTask オブジェクトを作成します。
  4. FutureTask オブジェクトを構築パラメータとして Thread に渡し、スレッドを開始します。
  5. public class CallableDemo {
    
        public static void main(String[] args) {
            //3.把Callable实现类对象作为构造参数传入FutureTask创建FutureTask对象。
            FutureTask<UUID> futureTask = new FutureTask<UUID>(new MyCallable());
            //4.把FutureTask对象作为构造参数传入Thread,并开启线程
            new Thread(futureTask).start();
            try {
                System.out.println(futureTask.get());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
    }
    
    //1. 实现**Callable**接口
    class MyCallable implements Callable<UUID> {
    
        //2.重写**call**方法,相当于thread中的run方法。不同的是call方法允许有返回值
        @Override
        public UUID call() throws Exception {
            //生成随机数
            return UUID.randomUUID();
        }
    }
  6. Thread を継承して、Runnable と Callable の違いを認識します

ソース コード実装から

Inherit Thread

サブクラスは Thread の run() メソッドを書き換えて、start() メソッドを呼び出します。jvm はサブクラスの run を自動的に呼び出します。 ()

Runnableの実装

new Thread(myRunnable)は、Threadのコンストラクタにrunnableの参照を入れ、スレッドのメンバ変数targetに渡します。 Thread run() メソッドでは、ターゲットが空でないと判断し、サブクラスの run メソッドを呼び出します。

    public void run() {
    if (this.target != null) {
        this.target.run();
    }

Callable インターフェイスを実装します。

Callable インターフェイスを実装し、オーバーライドします。 Call() メソッドを使用し、スレッドの戻り値を提供したり、例外をスローしたりすることもできます。最後に、Runnable のサブインターフェイス RunnableFuture の実装クラス FutureTask を通じて、Thread のメンバー変数 target に渡されます。

使用法と拡張の点で

スレッドの継承

    利点: スレッド内で start() メソッドを直接呼び出すことができ、非常に簡単です
  1. 欠点: Java は単一継承のみをサポートします。サブクラスがスレッドを継承する場合、他のクラスを継承することはできません。
  2. Runnable を実装します。
利点: Java は多くのものを実装できます

  1. 欠点: コードの記述が複雑で、start() を直接呼び出すことができません

  2. 実装Callable の数

利点: Java は複数の方法で実装でき、例外をスローでき、戻り値を持つことができます

  1. 欠点: コードの作成は困難です複雑###### ###

以上がJavaでマルチスレッドを作成するにはどうすればよいですか? (詳細)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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