创建线程三种方法

简介: 创建线程三种方法

创建和运行线程

方法一,直接使用 Thread

1. // 创建线程对象
2. Thread t = new Thread() {
3. public void run() {
4. // 要执行的任务
5.    }
6. };
7. // 启动线程
8. t.start();

例如:

1. // 构造方法的参数是给线程指定名字,推荐
2. Thread t1 = new Thread("t1") {
3. @Override
4. // run 方法内实现了要执行的任务
5. public void run() {
6.                 log.debug("hello");
7.             }
8.         };
9.         t1.start();

方法二,使用 Runnable 配合 Thread

把【线程】和【任务】(要执行的代码)分开

  • Thread 代表线程
  • Runnable 可运行的任务(线程要执行的代码)
1. Runnable runnable = new Runnable() {
2. public void run() {
3. // 要执行的任务
4.             }
5.         };
6. // 创建线程对象
7. Thread t = new Thread(runnable);
8. // 启动线程
9.         t.start();

例如:

1. public class Test2 {
2.  public static void main(String[] args) {
3.    //创建线程任务
4.    Runnable r = () -> {
5. //直接写方法体即可
6.      System.out.println("Runnable running");
7.      System.out.println("Hello Thread");
8.    };
9.    //将Runnable对象传给Thread
10.     Thread t = new Thread(r);
11.     //启动线程
12.     t.start();
13.   }
14. }

方法三:使用FutureTask与Thread结合

使用FutureTask可以用泛型指定线程的返回值类型(Runnable的run方法没有返回值)

FutureTask 能够接收 Callable 类型的参数,用来处理有返回结果的情况

1. // 创建任务对象
2.         FutureTask<Integer> task3 = new FutureTask<>(() -> {
3.             log.debug("hello");
4. return 100;
5.         });
6. // 参数1 是任务对象; 参数2 是线程名字,推荐
7. new Thread(task3, "t3").start();
8. // 主线程阻塞,同步等待 task 执行完毕的结果
9. Integer result = task3.get();
10.         log.debug("结果是:{}", result);
1. public class Test3 {
2.  public static void main(String[] args) throws ExecutionException, InterruptedException {
3. //需要传入一个Callable对象
4.    FutureTask<Integer> task = new FutureTask<Integer>(new Callable<Integer>() {
5.      @Override
6.      public Integer call() throws Exception {
7.        System.out.println("线程执行!");
8.        Thread.sleep(1000);
9.        return 100;
10.       }
11.     });
12. 
13.     Thread r1 = new Thread(task, "t2");
14.     r1.start();
15.     //获取线程中方法执行后的返回结果
16.     System.out.println(task.get());
17.   }
18. }

方式四:使用线程池例如用Executor框架

参数介绍

1. public ThreadPoolExecutor(int corePoolSize,
2.                               int maximumPoolSize,
3.                               long keepAliveTime,
4.                               TimeUnit unit,
5.                               BlockingQueue<Runnable> workQueue,
6.                               ThreadFactory threadFactory,
7.                               RejectedExecutionHandler handler) {
8. if (corePoolSize < 0 ||
9.             maximumPoolSize <= 0 ||
10.             maximumPoolSize < corePoolSize ||
11.             keepAliveTime < 0)
12. throw new IllegalArgumentException();
13. if (workQueue == null || threadFactory == null || handler == null)
14. throw new NullPointerException();
15. this.acc = System.getSecurityManager() == null ?
16. null :
17.                 AccessController.getContext();
18. this.corePoolSize = corePoolSize;
19. this.maximumPoolSize = maximumPoolSize;
20. this.workQueue = workQueue;
21. this.keepAliveTime = unit.toNanos(keepAliveTime);
22. this.threadFactory = threadFactory;
23. this.handler = handler;
24.     }

* @param corePoolSize the number of threads to keep in the pool, even * if they are idle, unless {@code allowCoreThreadTimeOut} is set

池中一直保持的线程的数量,即使线程空闲也不会释放。除非设置了 allowCoreThreadTimeOut *

@param maximumPoolSize the maximum number of threads to allow in the * pool

池中允许的最大的线程数

* @param keepAliveTime when the number of threads is greater than * the core, this is the maximum time that excess idle threads * will wait for new tasks before terminating.

当线程数大于核心线程数的时候,线程在最大多长时间没有接到新任务就会终止释放, 最终线程池维持在 corePoolSize 大小

* @param unit the time unit for the {@code keepAliveTime} argument

时间单位

* @param workQueue the queue to use for holding tasks before they are* executed. This queue will hold only the {@code Runnable} * tasks submitted by the {@code execute} method.

阻塞队列,用来存储等待执行的任务,如果当前对线程的需求超过了 corePoolSize

大小,就会放在这里等待空闲线程执行。

* @param threadFactory the factory to use when the executor * creates a new thread

创建线程的工厂,比如指定线程名等

* @param handler the handler to use when execution is blocked * because the thread bounds and queue capacities are reached

拒绝策略,如果线程满了,线程池就会使用拒绝策略

运行原理:

1、线程池创建,准备好 core 数量的核心线程,准备接受任务

2、新的任务进来,用 core 准备好的空闲线程执行。

(1) 、core 满了,就将再进来的任务放入阻塞队列中。空闲的 core 就会自己去阻塞队 列获取任务执行

(2) 、阻塞队列满了,就直接开新线程执行,最大只能开到 max 指定的数量

(3) 、max 都执行好了。Max-core 数量空闲的线程会在 keepAliveTime 指定的时间后自 动销毁。最终保持到 core 大小

(4) 、如果线程数开到了 max 的数量,还有新任务进来,就会使用 reject 指定的拒绝策 略进行处理

3、所有的线程创建都是由指定的 factory 创建的。


相关文章
|
2月前
|
存储 Oracle Java
|
4月前
|
Java
创建线程的方法
Java中实现多线程有四种方式:1. 继承Thread类,简单但占用继承机会,耦合度高;2. 实现Runnable接口,推荐方式,任务与线程解耦,支持Lambda;3. 实现Callable接口配合FutureTask,可获取返回值和异常;4. 使用线程池(ExecutorService),企业推荐,管理线程生命周期,提升性能,支持多种线程池类型。
116 1
|
5月前
|
Java 数据挖掘 调度
Java 多线程创建零基础入门新手指南:从零开始全面学习多线程创建方法
本文从零基础角度出发,深入浅出地讲解Java多线程的创建方式。内容涵盖继承`Thread`类、实现`Runnable`接口、使用`Callable`和`Future`接口以及线程池的创建与管理等核心知识点。通过代码示例与应用场景分析,帮助读者理解每种方式的特点及适用场景,理论结合实践,轻松掌握Java多线程编程 essentials。
345 5
|
监控 Java
捕获线程执行异常的多种方法
【10月更文挑战第15天】捕获线程执行异常的方法多种多样,每种方法都有其特点和适用场景。在实际开发中,需要根据具体情况选择合适的方法或结合多种方法来实现全面有效的线程异常捕获。这有助于提高程序的健壮性和稳定性,减少因线程异常带来的潜在风险。
272 57
|
11月前
|
缓存 安全 Java
【JavaEE】——单例模式引起的多线程安全问题:“饿汉/懒汉”模式,及解决思路和方法(面试高频)
单例模式下,“饿汉模式”,“懒汉模式”,单例模式下引起的线程安全问题,解锁思路和解决方法
|
11月前
|
Java 程序员 调度
【JavaEE】线程创建和终止,Thread类方法,变量捕获(7000字长文)
创建线程的五种方式,Thread常见方法(守护进程.setDaemon() ,isAlive),start和run方法的区别,如何提前终止一个线程,标志位,isinterrupted,变量捕获
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
237 3
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
131 2
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
175 1
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
299 1

热门文章

最新文章