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();
}
}
実行結果:
スレッドプールの利点
减少在创建和销毁线程上所消耗的时间以及系统资源的开销,解决资源不足的问题。