ToB企服应用市场:ToB评测及商务社交产业平台

标题: Java 创建多线程的三种方法 [打印本页]

作者: 知者何南    时间: 2023-12-22 02:23
标题: Java 创建多线程的三种方法
在Java中创建多线程,往往都要通过Thread类来实现,今天学习下Java中创建多线程的三种方法[1]。
1.继承Thread类

通过继承 Thread类 实现多线程。
主要方法:
实现步骤:
demo
  1. public class MyThreadExtendsThread extends Thread {
  2.     private int num;
  3.     public MyThreadExtendsThread() {};
  4.     public MyThreadExtendsThread(int num) {
  5.         this.num = num;
  6.     }
  7.     @Override
  8.     public void run() {
  9.         for (int i = 0; i < num; i++) {
  10.             System.out.println(Thread.currentThread().getName() + " 子线程:" + i);
  11.         }
  12.     }
  13.     public static void main(String[] args) throws InterruptedException {
  14.         Thread t1 = new MyThreadExtendsThread();
  15.         Thread t2 = new MyThreadExtendsThread(100000);
  16.         t2.setDaemon(true); // true, 主线程结束,子线程也随之退出, false, 主线程结束后,子线程继续执行
  17.         t1.start();
  18.         t2.start();
  19.         for (int i = 0; i < 10; i++) {
  20.             System.out.println("主线程:" + i);
  21.         }
  22.         // 等待子线程完成任务
  23.         Thread.sleep(10L);
  24.         /*
  25.         子线程:0
  26.         子线程:1
  27.         主线程:0
  28.         子线程:2
  29.         主线程:1
  30.         主线程:2
  31.         主线程:3
  32.         主线程:4
  33.         主线程:5
  34.         主线程:6
  35.         主线程:7
  36.         子线程:3
  37.         子线程:4
  38.         子线程:5
  39.         子线程:6
  40.         子线程:7
  41.         子线程:8
  42.         子线程:9
  43.         主线程:8
  44.         主线程:9
  45.          */
  46.     }
  47. }
复制代码
2.实现Runnable接口

通过实现 Runnable接口 实现多线程。
主要方法:
实现步骤:
demo
  1. public class MyThreadImplementsRunnable implements Runnable {
  2.     @Override
  3.     public void run() {
  4.         for (int i = 0; i < 5; i++) {
  5.             System.out.println("子线程:" + i);
  6.         }
  7.     }
  8.     public static void main(String[] args) throws InterruptedException {
  9.         Runnable t1 = new MyThreadImplementsRunnable();
  10.         new Thread(t1).start();
  11.         for (int i = 0; i < 5; i++) {
  12.             System.out.println("主线程:" + i);
  13.         }
  14.         Thread.sleep(1000L);
  15.         /*
  16.         子线程:0
  17.         主线程:0
  18.         主线程:1
  19.         主线程:2
  20.         主线程:3
  21.         主线程:4
  22.         子线程:1
  23.         子线程:2
  24.         子线程:3
  25.         子线程:4
  26.          */
  27.     }
  28. }
复制代码
3.实现Callable接口

通过实现 Callable接口 实现多线程。
主要方法:
实现步骤:
demo
  1. import java.util.concurrent.Callable;
  2. import java.util.concurrent.ExecutionException;
  3. import java.util.concurrent.FutureTask;
  4. public class MyThreadImplementsCallable implements Callable {
  5.     private int num;
  6.     public MyThreadImplementsCallable(int num) {
  7.         this.num = num;
  8.     }
  9.     @Override
  10.     public String call() throws Exception {
  11.         int sum = 0;
  12.         for (int i = 0; i < num; i++) {
  13.             sum += i;
  14.         }
  15.         return "线程求出 -> " + num + "之内的和为:" + sum;
  16.     }
  17.     public static void main(String[] args) throws InterruptedException, ExecutionException {
  18.         Callable callable = new MyThreadImplementsCallable(1000);
  19.         // 创建未来任务实现Callable接口
  20.         FutureTask<String> futureTask = new FutureTask<>(callable);
  21.         new Thread(futureTask).start();
  22.         // 获取线程任务结束后的结果
  23.         String res = futureTask.get();
  24.         System.out.println("res: " + res);
  25.         // res: 线程求出 -> 1000之内的和为:499500
  26.     }
  27. }
复制代码
4.方法对比

以下为多线程中类关系图:

从关系图中可知:
如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享[2]。
总结:
实现Runnable接口比继承Thread类所具有的优势:
1):适合多个相同的程序代码的线程去处理同一个资源
2):可以避免java中的单继承的限制
3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立
4):线程池只能放入实现Runable或callable类线程,不能直接放入继承Thread的类
参考:

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4