驚くばかり!Javaマルチスレッドはとても単純であることがわかりました

Javaでスレッドを作成する3つの方法とスレッドプールの使用


新しいスレッドを作成する
最も一般的な方法は、スレッドを使用しRunnableてインターフェイスを作成し
次にThreadクラスを使用して新しいスレッドを作成する
ことです。新しいスレッドが必要な場合は、戻り値が使用さCallableれ、Futureインターフェイスを使用して新しいスレッドを作成します。


JDK1.5がExecutors工厂类直接スレッドプールを作成した後、スレッドプールを使用すると、スレッドプールを使用して
システムリソースを合理的に管理できます。


マルチスレッドの詳細↓↓↓(ほとんど読んでいない)
https://blog.csdn.net/weixin_44580492/article/details/109263425


1.Threadクラスを継承します

実装手順

1.Threadクラスの新しいサブクラスを作成します パブリッククラスXxxはスレッド{}を拡張します
2. Threadクラス子类中重写 run 方法で、スレッドタスク(スレッドの開始方法)を設定し
ます。3
テストクラス4にThreadクラスのサブクラスオブジェクトを作成しますThreadクラスを呼び出す start メソッド、新しいスレッドを開始し、自動的に実行します run 方法

コード例

1.Threadクラスのサブクラスを作成します

public class NewThread extends Thread{
    
    
	//重写 run 方法,设置线程(开启线程要做什么)
    @Override
    public void run() {
    
    
        for (int i = 0; i < 5; i++) {
    
    
            System.out.println("run"+i);
        }
    }
}

2. Threadクラスのサブクラスを作成し、スレッドを開始します

[PS]はいstartメソッドを呼び出してスレッドを開始しますrunメソッドを呼び出す代わりに。startメソッドを呼び出すと、runメソッドが自動的に実行されます

public class Demo {
    
    
    public static void main(String[] args) {
    
    
        NewThread nt = new NewThread();
        nt.start();
        //nt.run();//调用run方法不会开启线程
        for (int i = 0; i < 5; i++) {
    
    
            System.out.println("main"+i);
        }
    }
}

プログラムの実行結果:
ここに画像の説明を挿入します

2.Runnableインターフェースを実装します

実装手順

1.新しいRunnableを実装クラスを作成します
。2.上書きRunnableのrunメソッド
3.通过 Thread 的构造方法,将 Runnable 的实现类对象传递给 Thread 类
スレッドを開始するスレッドオブジェクトを介して4コールにstartメソッドを
   、Runnableインタフェースにはstartメソッドが存在しないので、

コード例
1.Runableの新しい実装クラス

public class NewThread implements Runnable{
    
    
    @Override
    public void run() {
    
    
        System.out.println("使用Runnable接口创建线程");
    }
}

2.新しいスレッドを開始します

public class Demo {
    
    
    public static void main(String[] args) {
    
    
    	//创建 Runable 的实现类对象
    	NewThread nt = new NewThread();
    	//创建 Thread 对象,并通过构造方法将实现类对象传递给Thread类
    	Thread t = new Thread(nt);
    	//调用 start 方法开启新线程
    	t.start();
//=======上方三行代码和下方一行代码是等价的=========
        new Thread(new NewThread()).start();//使用 匿名对象 开启线程避免繁琐

        System.out.println("main主线程");
    }
}

プログラムの実行結果:

两条语句的打印顺序依旧是随机执行,不再截图演示

3.CallableおよびFutureインターフェースを使用する

このようにスレッドを作成することで、次のことができます。获取新线程任务的返回值

実装手順

1.作成の実装クラス呼び出し可能インタフェース<V>を
実装クラス2. 重写 Callable 接口中的 call 方法(これは実行方法ではないことに注意してください)
を作成3のオブジェクトFutureTaskを<V>クラスが
作成し4の対象スレッドのクラスを、将 FutureTask 对象传递到 Thread 的构造方法
5。Threadオブジェクトを使用してstartメソッドを呼び出し、新しいスレッドを開始します

コード例

1. Callableの新しい実装クラスを作成し、callメソッドを書き直します

public class CallableThread implements Callable<Integer>{
    
    
	//重写call方法,编写线程任务
	//call方法的返回值类型由Callable接口的泛型决定
    @Override
    public Integer call() throws Exception {
    
    
        int i = 0;
        for (; i < 5; i++) {
    
    
            System.out.println(Thread.currentThread().getName()+i);
        }
        return i;
    }
}

2.新しいスレッドを開始します

public class Demo {
    
    
    public static void main(String[] args) throws ExecutionException, InterruptedException {
    
    
    	//创建Callable实现类对象
        CallableThread ct = new CallableThread();
        //创建FutureTask对象,将Callable实现类对象传递到其构造方法中
        FutureTask<Integer> ft = new FutureTask<>(ct);
        //将FutureTask对象传递给Thread对象,并调用start方法开启新线程
        new Thread(ft).start();
        
        //main方法的线程任务
        int i = 0;
        for (; i < 5; i++) {
    
    
            System.out.println(Thread.currentThread().getName()+i);
        }
        
        //获取call方法的返回值
        Integer num = ft.get();
        System.out.println("call方法的返回值为:" + num);
    }
}

プログラム実行結果
ここに画像の説明を挿入します
【チップ】

  • 传递给呼び出し可能<V>接口的泛型是作为call方法返回值类型的
  • 新しいスレッドタスクの戻り値を取得します。使用FutureTask取得する方法
  • getメソッドは2つの例外、すなわちExecutionExceptionは、InterruptedExceptionあるが持っている
    (スローまたはのtry / catch)処理する必要があるの
    コンセプト

4.スレッドプール

スレッドプールスレッドの集合として理解できます。新しいスレッドを開く必要がある場合は、スレッドプールから直接取得され、使い果たされるとスレッドプールに戻されます。

スレッドプールを使用する手順

1.スレッドプールを使用する 遺言執行者 ファクトリクラスで newFixedThreadPool静的メソッドは、指定された数のスレッドプールを生成します
2. Runnableインターフェースを実装するための実装クラスを作成し、runメソッドを書き直して、スレッドタスクを設定します。3
。呼び出しますExecutorService インターフェースで 参加する メソッド、スレッドタスクの受け渡し(Runnableの実装クラス)、スレッドを開始
4.電話する ExecutorService インターフェースで シャットダウン 方法スレッドプールを破棄します(使用はお勧めしません)

コード例

public class Demo01 {
    
    
    public static void main(String[] args) {
    
    
        //开启线程池,并放入 5 个线程
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        int i = 1;
        //使用while循环从线程池开启 10 个线程
        //开启 10 个线程的目的是,观察线程的复用,体现线程池的价值
        while(i<=10){
    
    
            i++;
            //开启一个线程
            executorService.submit(new Thread(() -> {
    
    
                System.out.println("线程池开启线程!"+Thread.currentThread().getName());
            }));
        }
        //销毁线程池
        executorService.shutdown();
    }
}

実行結果
ここに画像の説明を挿入します
スレッドプールの利点

减少在创建和销毁线程上所消耗的时间以及系统资源的开销,解决资源不足的问题。

おすすめ

転載: blog.csdn.net/weixin_44580492/article/details/111498364