当前位置:   article > 正文

Java中创建线程的多种方式实例

Java中创建线程的多种方式实例

目录

1、普通Thread创建

2、实现Runnable接口创建线程

3、匿名方式创建

4、使用Lambda表达式创建线程

5、实现Callable接口创建线程

6、线程池方式

7、线程工具类


在Java中创建线程的方式有多种,以下是几种常见的创建线程的方式,选择哪种方式取决于具体的需求和设计。需要注意的是,在使用多线程时,要确保线程安全,避免出现并发问题。

1、普通Thread创建

  1. //继承创建线程
  2. static class NewThread extends Thread {
  3. @Override
  4. public void run() {
  5. System.out.println("继承Thread创建线程-1 = " + DateUtils.getNowTime());
  6. try {
  7. sleep(1000);
  8. } catch (InterruptedException e) {
  9. throw new RuntimeException(e);
  10. }
  11. System.out.println("继承Thread创建线程-2 = " + DateUtils.getNowTime());
  12. }
  13. }

启动线程

  1. //普通Thread创建
  2. NewThread nt = new NewThread();
  3. nt.start();

2、实现Runnable接口创建线程

  1. // 实现Runnable接口创建线程
  2. static class NewRunnable implements Runnable {
  3. @Override
  4. public void run() {
  5. System.out.println("实现Runnable接口-3 = " + DateUtils.getNowTime());
  6. //等待
  7. try {
  8. Thread.sleep(2000);
  9. } catch (InterruptedException e) {
  10. throw new RuntimeException(e);
  11. }
  12. System.out.println("实现Runnable接口-4 = " + DateUtils.getNowTime());
  13. }
  14. }

启动线程

  1. //普通Runnable创建
  2. NewRunnable nr = new NewRunnable();
  3. Thread t = new Thread(nr);
  4. t.start();

3、匿名方式创建

  1. //匿名Thread创建
  2. Thread t1 = new Thread(new Thread() {
  3. @Override
  4. public void run() {
  5. System.out.println("匿名Thread" + DateUtils.getNowTime());
  6. }
  7. });
  8. t1.start();
  9. //匿名Runnable创建
  10. Thread t2 = new Thread(new Runnable() {
  11. @Override
  12. public void run() {
  13. System.out.println("匿名Runnable创建 = " + DateUtils.getNowTime());
  14. }
  15. });
  16. t2.start();

4、使用Lambda表达式创建线程

  1. //使用Lambda表达式创建线程
  2. Thread t3 = new Thread(() -> System.out.println("Lambda表达式创建1 = " + DateUtils.getNowTime()));
  3. t3.start();
  4. Runnable r = () -> {
  5. System.out.println("Lambda表达式创建2 = " + DateUtils.getNowTime());
  6. };
  7. Thread t4 = new Thread(r);
  8. t4.start();

5、实现Callable接口创建线程

在使用这个 Callable创建线程的时候,是有返回值的线程调用

  1. /**
  2. * 实现Callable接口创建线程
  3. * 是有返回值的线程调用
  4. */
  5. static class NewCallable implements Callable<String> {
  6. @Override
  7. public String call() throws Exception {
  8. System.out.println("实现Callable接口创建线程-5 = " + DateUtils.getNowTime());
  9. Thread.sleep(3000);
  10. System.out.println("实现Callable接口创建线程-6 = " + DateUtils.getNowTime());
  11. return "Callable接口创建线程";
  12. }
  13. }

启动线程

  1. //调用callable创建线程
  2. Callable<String> callable = new Callable<String>() {
  3. @Override
  4. public String call() throws Exception {
  5. return "callable创建线程";
  6. }
  7. };
  8. //FutureTask<String> futureTask = new FutureTask<>(callable);
  9. // 调用NewCallable()
  10. FutureTask<String> futureTask = new FutureTask<>(new NewCallable());
  11. Thread t5 = new Thread(futureTask);
  12. t5.start();

6、线程池方式

创建线程池的时候,可以定义线程池的大小,线程池中可以执行多个任务。若需要获取异步执行任务的返回值的话,使用submit方法;若是让一个任务在线程池中异步执行,使用execute方法即可。
  1. // 相同点:
  2. // submit和execute方法均可以像线程池中提交一个任务,让线程池来异步执行这个任务
  3. // 不同点:
  4. // submit可以接受Runnable和Callable任务,但execute只能接受Runnable任务;
  5. // submit方法的返回值是一个Future,而execute方法的返回值是void;
  6. // 对于异常的处理,使用submit方式提交的任务若在执行的过程中抛出了异常的话,异常信息在控制台中看不到,需要通过Future.get方法来获取这个异常;
  7. // 使用execute方式提交的任务若在执行的过程中出现异常的话,异常信息会被打印到控制台;
  8. // 创建一个10个大小的线程池
  9. ExecutorService executorService = Executors.newFixedThreadPool(10);
  10. // 提交任务到线程池、创建一个线程
  11. executorService.submit(new NewRunnable());
  12. // 执行一个任务
  13. executorService.execute(new Runnable() {
  14. @Override
  15. public void run() {
  16. System.out.println("线程池创建线程 = " + DateUtils.getNowTime());
  17. }
  18. });
  19. // 关闭线程池
  20. executorService.shutdown();

7、线程工具类

  1. import com.terra.utils.DateUtils;
  2. import java.util.concurrent.Callable;
  3. import java.util.concurrent.ExecutorService;
  4. import java.util.concurrent.Executors;
  5. import java.util.concurrent.FutureTask;
  6. public class T1 {
  7. public static void main(String[] args) {
  8. //普通Thread创建
  9. NewThread nt = new NewThread();
  10. nt.start();
  11. //匿名Thread创建
  12. Thread t1 = new Thread(new Thread() {
  13. @Override
  14. public void run() {
  15. System.out.println("匿名Thread" + DateUtils.getNowTime());
  16. }
  17. });
  18. t1.start();
  19. //普通Runnable创建
  20. NewRunnable nr = new NewRunnable();
  21. Thread t = new Thread(nr);
  22. t.start();
  23. //匿名Runnable创建
  24. Thread t2 = new Thread(new Runnable() {
  25. @Override
  26. public void run() {
  27. System.out.println("匿名Runnable创建 = " + DateUtils.getNowTime());
  28. }
  29. });
  30. t2.start();
  31. //使用Lambda表达式创建线程
  32. Thread t3 = new Thread(() -> System.out.println("Lambda表达式创建1 = " + DateUtils.getNowTime()));
  33. t3.start();
  34. Runnable r = () -> {
  35. System.out.println("Lambda表达式创建2 = " + DateUtils.getNowTime());
  36. };
  37. Thread t4 = new Thread(r);
  38. t4.start();
  39. //调用callable创建线程
  40. Callable<String> callable = new Callable<String>() {
  41. @Override
  42. public String call() throws Exception {
  43. return "callable创建线程";
  44. }
  45. };
  46. //FutureTask<String> futureTask = new FutureTask<>(callable);
  47. // 调用NewCallable()
  48. FutureTask<String> futureTask = new FutureTask<>(new NewCallable());
  49. Thread t5 = new Thread(futureTask);
  50. t5.start();
  51. // 相同点:
  52. // submit和execute方法均可以像线程池中提交一个任务,让线程池来异步执行这个任务
  53. // 不同点:
  54. // submit可以接受Runnable和Callable任务,但execute只能接受Runnable任务;
  55. // submit方法的返回值是一个Future,而execute方法的返回值是void;
  56. // 对于异常的处理,使用submit方式提交的任务若在执行的过程中抛出了异常的话,异常信息在控制台中看不到,需要通过Future.get方法来获取这个异常;
  57. // 使用execute方式提交的任务若在执行的过程中出现异常的话,异常信息会被打印到控制台;
  58. // 创建一个10个大小的线程池
  59. ExecutorService executorService = Executors.newFixedThreadPool(10);
  60. // 提交任务到线程池、创建一个线程
  61. executorService.submit(new NewRunnable());
  62. // 执行一个任务
  63. executorService.execute(new Runnable() {
  64. @Override
  65. public void run() {
  66. System.out.println("线程池创建线程 = " + DateUtils.getNowTime());
  67. }
  68. });
  69. // 关闭线程池
  70. executorService.shutdown();
  71. }
  72. //继承创建线程
  73. static class NewThread extends Thread {
  74. @Override
  75. public void run() {
  76. System.out.println("继承Thread创建线程-1 = " + DateUtils.getNowTime());
  77. try {
  78. sleep(1000);
  79. } catch (InterruptedException e) {
  80. throw new RuntimeException(e);
  81. }
  82. System.out.println("继承Thread创建线程-2 = " + DateUtils.getNowTime());
  83. }
  84. }
  85. // 实现Runnable接口创建线程
  86. static class NewRunnable implements Runnable {
  87. @Override
  88. public void run() {
  89. System.out.println("实现Runnable接口-3 = " + DateUtils.getNowTime());
  90. //等待
  91. try {
  92. Thread.sleep(2000);
  93. } catch (InterruptedException e) {
  94. throw new RuntimeException(e);
  95. }
  96. System.out.println("实现Runnable接口-4 = " + DateUtils.getNowTime());
  97. }
  98. }
  99. /**
  100. * 实现Callable接口创建线程
  101. * 是有返回值的线程调用
  102. */
  103. static class NewCallable implements Callable<String> {
  104. @Override
  105. public String call() throws Exception {
  106. System.out.println("实现Callable接口创建线程-5 = " + DateUtils.getNowTime());
  107. Thread.sleep(3000);
  108. System.out.println("实现Callable接口创建线程-6 = " + DateUtils.getNowTime());
  109. return "Callable接口创建线程";
  110. }
  111. }
  112. // 使用线程池创建线程
  113. static class NewThreadPool {
  114. public static void main(String[] args) {
  115. // 创建大小2个任务的线程池
  116. ExecutorService executorService = Executors.newFixedThreadPool(2);
  117. // 提交任务
  118. executorService.submit(new NewRunnable());
  119. executorService.submit(new NewCallable());
  120. // 关闭线程池
  121. executorService.shutdown();
  122. }
  123. }
  124. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/323653
推荐阅读
相关标签
  

闽ICP备14008679号