Javaマルチスレッド学習(1)javaスレッドRunnable、Thread、Callable、FutureTask

スレッドの作成方法

1.スレッドオブジェクト

1.1Threadオブジェクトを継承する

@Slf4j
public class MyThread extends Thread{
    
    
    @Override
    public void run() {
    
    
        // 线程要执行的内容
        log.debug("继承Thread方式");
    }
}

public class Test1 {
    
    
    public static void main(String[] args) {
    
    
        new MyThread().start(); // 启动线程
    }
}

1.2Threadオブジェクトを直接使用する

public class Test1 {
    
    
    public static void main(String[] args) {
    
    
        Thread t = new Thread(){
    
    
            @Override
            public void run() {
    
    
                log.debug("线程执行");
            }
        };
        t.start();
    }
}

2.実行可能なインターフェース

public class MyThread implements Runnable{
    
    
    @Override
    public void run() {
    
    
        // 该线程执行内容
        System.out.println("线程执行");
    }
}

public static void main(String[] args) {
    
    
        MyThread myThread = new MyThread();
        Thread t1 = new Thread(myThread, "t1");
        t1.start();

        // jdk8 Lambda
        Thread t2 = new Thread(()->{
    
     System.out.println("t2执行");}, "t1");
        t2.start();

        Runnable runnable = ()->{
    
     System.out.println("t3执行"); };
        Thread t3 = new Thread(runnable, "t3");
        t3.start();
    }

3.ランナブルとスレッドの関係

実行可能ファイルを実行するには、スレッドに渡す必要があります

      Runnable runnable = ()->{
    
     System.out.println("t3执行"); };
      Thread t3 = new Thread(runnable, "t3");
      t3.start();

スレッドのソースコードをクリックして、Runnableがinitメソッドに渡されることを確認します

https://img-blog.csdnimg.cn/20201027204059703.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNTM5OTYy,size_
initが別のinitに渡されていることがわかり
ここに写真の説明を挿入
ます。initメソッドがそれ自体の変数を渡していることがわかります。

ここに写真の説明を挿入
Threadクラスのrun()メソッドが最終的にこのRunnableのrunメソッドを呼び出すことがわかりました。

ここに写真の説明を挿入

Runnableの実行は、最終的にはThreadの実行です。Threadのrunメソッドが再実行されない場合、Threadのrunメソッドは、最初にRunnableが渡されているかどうかを判別し、渡されている場合は、Runnableのrunメソッドを実行します。

3.Callable和FutureTask

FutureTask自体がRunnableFutureを実装します

public class FutureTask<V> implements RunnableFuture<V>

RunnableFutureはRunnableとFutureを継承します

public interface RunnableFuture<V> extends Runnable, Future<V>

つまり、FutureTaskもRunnableと見なすことができますが
、Futureのメソッドを継承するため、Runnableよりも強力です。これにより、スレッドの実行結果を取得できます
ここに写真の説明を挿入
。Callableは単なるインターフェイスです。その呼び出しメソッドとRunnable実行メソッドは本質的に類似しており、すべてスレッドです。その中でコードを実行しますが、呼び出しには一般的な戻り値があり、例外をスローすることもあります。runメソッドには例外がなく、内部でダイジェストする必要があります。

ここに写真の説明を挿入

ただし、コードを実行するときは、startメソッドを使用し、runメソッドを実行しますが、runメソッドではなくcallメソッドを書き直したことがわかりました。

ここに写真の説明を挿入

FutureTaskクラスをクリックして、内部のrunメソッドをオーバーライドしていることを確認します。開始時にスレッドを開始すると、runメソッドは着信Callableのcallメソッドを呼び出し、ここで例外を処理します。 getおよびその他のメソッドを呼び出すために、値がFutureTaskのsetメソッドに返されます。

ここに写真の説明を挿入

値は変数の結果に返されます

ここに写真の説明を挿入
getメソッドが呼び出されると、reportメソッド
ここに写真の説明を挿入
が呼び出されます。メソッドの戻り値は、呼び出しを呼び出すrunメソッドの値です。

ここに写真の説明を挿入

ここに写真の説明を挿入
getメソッドには戻り値があることに注意してください。これは、スレッドが非同期に戻るまでブロックすることを意味します。

おすすめ

転載: blog.csdn.net/qq_43539962/article/details/109300838