Java:创建线程、线程池有关内容汇总

news/2024/6/29 13:47:58

Java:创建线程、线程池有关内容汇总

  • 前言
  • 一、创建线程的4种方法
    • 1.继承Thread类
    • 2.实现Runnable接口
    • 3.实现Callable接口
    • 4.线程池
  • 二、线程池状态
    • 1.RUNNING
    • 2.SHUTDOWN
    • 3.STOP
    • 4.TIDYING
    • 5.TERMINATED
  • 三、为什么不建议使用Executors来创建线程池?
  • 总结


前言

最近总结了有关Java线程的一些问题和解决方案,这里做一个分享和总结。
后期还会分享一些有关Java锁、Redis持久化等有关问题的总结内容,都是我自己从多个文档、视频总结出来的,希望对大家有用!


一、创建线程的4种方法

部分内容参考自:JUC多线程:创建线程的四种方式

1.继承Thread类

Thread 实现了 Runnable 接口,代表一个线程的实例。启动线程的唯一方法就是通过 Thread 类的start() 方法。start() 方法是一个native方法,它将启动一个新线程,并执行run()方法。

public class MyThread extends Thread {

	public static void main(String[] args){
		MyThread thread = new MyThread();
		thread.start();
	}
	@Override
	public void run() {
		System.out.println("MyThread.run()");
	}
}

优点:简单,继承 Thread 类即可
缺点:Java是单继承,继承了Thread类之后无法再继承别的类

重点:
(1)重写的是 run() 方法而不是 start()方法!
(2)Java单继承针对的是类与类之间的单继承,接口Interface是可以多继承的

2.实现Runnable接口

通过实现 Runnable 接口,实现 run() 方法,将 Runnable 接口的实现类的实例作为 Thread 的带参构造函数中,并通过调用 start() 方法启动线程

public class MyThread implements Runnable {

	public static void main(String[] args){
		Thread thread = new Thread(new MyThread());
		thread.start();
	}
	
	public void run() {
		System.out.println("MyThread.run()");
	}
}

还可以通过匿名内部类的方式直接生成

public class MyThread {

	public static void main(String[] args){
		Thread thread = new Thread(new Runnable(){
			public void run(){
				System.out.println("Hello Runnable");
			}
		});
		thread.start();
	}
}

还可以通过lambda表达式的方式生成

public class MyThread {

	public static void main(String[] args){
		Thread thread = new Thread(() -> System.out.println("Hello lambda"));
		thread.start();
	}
}

Lambda表达式使用及详解:Java中Lambda表达式使用及详解

3.实现Callable接口

(1)实现 Callable 接口,并实现 call() 方法;
(2)创建 Callable 接口的实现类的实例,使用 FutureTask 类包装 Callable 对象,该 FutureTask 对象封装了 Callable 对象的 call() 方法的返回值;
(3)使用 FutureTask 对象作为 Thread 类的构造函数的 target 参数创建并启动线程;
(4)调用 FutureTask 对象的 get() 来获取子线程执行结束的返回值;

public class MyThread<String> implements Callable<String>{

	public static void main(String[] args) throws Exception{
		FutureTask<String> futureTask = new FutureTask<>(new MyThread());
		Thread thread = new Thread(futureTask);
		thread.start();
		String result = futureTask.get();
		System.out.println(result);
	}
	
    //重写call方法
    @Override
    public String call() {
        return "Hello Callable";
    }   
}

4.线程池

用 ThreadPoolExecutor 创建线程池,并从线程池中获取线程用于执行任务。在 JUC 中,Executor 框架已经实现了几种线程池,我们就以 Executor 的 newFixedThreadPool 来作为 Demo

public class MyThread implements Runnable {

	public static void main(String[] args) throws Exception{
		ExcutorService executorService = Excutors.newFixedTthreadPool(10);
		executor.execute(new MyThread);
	}
	
	public void run() {
		System.out.println("MyThread.run()");
	}
}

实现 Callable 或者 Runnable 接口都可以,由ExecutorService 来创建线程

线程池内容详解:ExecutorService详解

二、线程池状态

1.RUNNING

表示线程池正常运行,既能接受新任务,也会正常处理队列中的任务

2.SHUTDOWN

当调用线程池的 shutdown() 方法时,线程池就进入 SHUTDWON 状态,表示线程池处于正在关闭的状态,此状态下线程池不会接受新任务,但是会继续把队列中的任务处理完

3.STOP

当调用线程池的 shutdownnow() 方法时,线程池就进入 STOP 状态,表示线程池处于正在停止的状态,此状态下线程池既不会接受新任务,也不会处理队列中的任务,正在运行的线程也会被中断

4.TIDYING

线程池中没有线程在运行后,线程池的状态就会自动变为 TIDYING,并且会调用 terminated() ,该方法是空方法,留给程序员进行拓展

5.TERMINATED

terminated() 方法执行完之后,线程池状态就会变为 TERMINATED

三、为什么不建议使用Executors来创建线程池?


总结


http://lihuaxi.xjx100.cn/news/1247075.html

相关文章

信息系统项目管理工程师论文-项目沟通管理

项目沟通管理 ********年2月&#xff0c;我作为项目经理参与了某集团公司********项目建设&#xff0c;整个项目总投资300余万元&#xff0c;建设工期为10个月。某集团力图通过********&#xff08;简称SPMS项目&#xff09;的建设&#xff0c;实现所有子公司的软件研发过程规…

同事用python搞副业,失业了也能月入1W

今年2月&#xff0c;我失业了。好在是被裁的&#xff0c;有些补偿。裁的是整个部门&#xff0c;刚开始拿到赔偿以后还欢呼雀跃&#xff0c;天天聚会&#xff0c;天天嗨。到现在过去几个月了&#xff0c;我们没一个找到工作。我已经感受到了一股鸡蛋被煎糊的焦虑感 一次前同事聚…

【0207】Backend向客户端发送Client authentication的底层实现(10 - 2)

文章目录 1. 身份验证(authentication)状态码1.1 身份认证成功状态码2. 向客户端发送认证请求报文2.1 初始化发送消息(sending message)2.1.1 初始化 StringInfoData 结构体2.1.2 初始化 message type2.2 将认证状态码添加到发送缓冲区2.3 将完整的消息发送给客户端相关文章…

GCC命令与参数详解

GCC 命令与参数详解 无论是 C 还是 C 程序&#xff0c;将其从源代码转变为可执行代码的过程&#xff0c;具体可分为预处理 Preprocessing&#xff0c;编译 Compilation&#xff0c;汇编 Assembly&#xff0c;链接 Linking 这四个阶段。 默认情况下 GCC 指令会直接将源代码历经…

007、体系架构之PD

PD PD架构主要功能路由功能 TSO分配TSO概念分配过程时间窗口同步过程 调度总流程信息收集调度的实现调度需求生成调度执行调度调度的基本操作调度的策略 lablelabel与高可用label的配置 PD架构 PD&#xff1a;有高可用和强一致性。 也有leader。使用奇数的节点数量。它需要存储…

chatgpt赋能python:Python列表操作:如何使用Python将数据放入列表中

Python列表操作&#xff1a;如何使用Python将数据放入列表中 在Python中&#xff0c;列表是一种重要的数据结构&#xff0c;允许我们将多个项目存储在单个变量中。在本文中&#xff0c;我们将介绍如何将数据放入Python列表中。我们将讨论Python中的列表数据类型以及如何向列表…

基于人工智能,现代数据基础架构的新兴架构

作者 Matt Bornstein、Jennifer Li和Martin Casado 摘要 现代机器学习基础设施2.0新架构&#xff1a; http://bit.ly/3AVBpV6 这个图概括了机器学习基础设施2.0的主要组成部分。它涵盖了从数据转换到模型集成的全过程。每个阶段的具体工具和技术也在括号中列出。 结构解读 …

解决岛屿问题

Island 问题 整形二维数组arr中分布着许多1&#xff0c;其余都是0&#xff0c;彼此相连的一群1构成一个岛屿&#xff0c;斜线不表示相连&#xff0c;求岛屿的数量 思路 遍历数组&#xff0c;遇到1进行感染infect&#xff0c;将1改成2 实现 void infect(vector<vector&…