当前位置: 首页 > article >正文

多线程——创建

线程的创建与启动

Java中,所有的线程对象都必须是Thread类或其子类的实例。

三种创建方式:

  1. 集成Thread类创建线程类

    继承Thread类,重写run方法,run方法的方法体代表线程需要完成的任务,称为线程执行体。

    创建子类的实例,即创建了线程对象。

    调用线程对象的start方法就可以启动了该线程。

    class ThreadChild1 extends Thread {
    	@Override
    	public void run() {
    		super.run();
    		//...
    	}
    }
    private static void main(String[] args){
        //启动一个线程
        new ThreadChild1().start();
        //启动第二个线程
        new ThreadChild1().start();
    }
    
  2. 实现Runnable接口创建线程类

    实现Runnable接口,重写run方法,也是线程方法执行体。

    创建实现类的实例,将实例作为参数传到Thread构造函数中,可创建Thread线程对象

    class ThreadChild1 implements Runnable{
    	@Override
    	public void p run() {
    		//...
    	}
    }
    private static void main(String[] args){
        ThreadChild1 threadChild1 = new ThreadChild1();
        //启动一个线程
        new Thread(threadChild1, "first").start();
        //启动第二个线程
        new Thread(threadChild1, "second").start();
    }
    
  3. 使用Callable和Future创建线程

    创建Callable接口的实现类,重写call方法,call方法有返回值,再创建Callable实现类的实例。

    创建FutureTask实例传入Callable对象。

    再将FutureTask实例作为参数传到Thread构造函数中,可创建Thread线程对象。

    通过FutureTask实例对象调用get()方法得到子线程的返回值。

    class ThreadChild1 implements Callable<Integer> {
    	@Override
    	public Integer call() throws Exception {
                //...
    	}
    }
    private static void main(String[] args){
    	ThreadChild1 child1 = new n ThreadChild1();
    	FutureTask<Integer> task = new n FutureTask<>(child1);
        new Thread(task, "有返回值的线程").start();
        //获取子线程的返回值
        try {
       		System.out.println("子线程的返回值: "+futureTask.get());
        } catch (Exception e) {
        	e.printStackTrace();
        }
    }
    

一般推荐实现接口创建多线程,直接继承Thread后,无法再继承其他父类。

线程的生命周期

线程被创建并启动后,会经历五种状态。

新建new->就绪runnable->运行running->阻塞blocked->死亡dead

新建:

XxxThread xx = new XxxThread()

就绪:

调用start后,线程处于就绪状态,此时已经做好了执行的准备,可以运行了,但还没有运行,蓄势待发。

运行:

线程获得调度时,线程处于运行状态,开始执行run方法中的线程执行体。

阻塞:

线程处于活动状态,但是停止运行,没有CPU的使用权。

**1. 等待阻塞:**线程调用wait方法;调用join方法,等待别的线程终止或超时后执行本线程。

**2. 同步阻塞:**线程获取锁失败,会进入同步阻塞状态。

**3. 其他阻塞:**调用线程的sleep方法,等sleep完毕,转入就绪;发出I/O请求,请求处理完毕,线程转入就绪状态。

死亡:

退出run方法时,线程会自然死亡。

图解:

在这里插入图片描述


http://www.kler.cn/news/289008.html

相关文章:

  • UDP广播、 组播通信
  • macos 使用port查询并安装python2, python3多版本, 设置默认python版本方法
  • 算法训练营|图论第8天 拓扑排序 dijkstra
  • 【笔试练习】深信服校园招聘c/c 软件开发H卷
  • 使用python导出Excel表格中的lua配置
  • 初识Linux · 有关makefile
  • 【Rust光年纪】化学计算不完全指南:Rust语言库全面解析
  • jenv 一款macos下的开源JAVA多版本环境安装管理切换工具
  • Swift concurrency 5 — async let的理解与使用
  • 聊聊随机测试和猴子测试
  • Python参数传递的艺术:解锁编程灵活性的秘密武器
  • uniapp写的一个年月日时分秒时间选择功能
  • 【数据结构初阶】——栈和队列
  • 求三元组中可能出现的最小距离
  • RabbitMQ练习(Routing)
  • 使用COAP和MQTT协议的多协议方法开发的用于机器人手术的自动医疗物联网系统
  • vue3+ts 实现模板表格文件下载~
  • pikachu文件包含漏洞靶场攻略
  • 密钥分发与公钥认证:保障网络通信的安全
  • MySQL入门学习-MySQL的连接查询
  • MySQL——事务与存储过程(二)存储过程的创建(4)光标的使用
  • 【Linux学习笔记】protobuf相关操作
  • 数仓基础(九):各大公司实时数仓实践
  • Go锁 详解
  • k8s-使用Network Policies实现网络隔离
  • (二)、软硬件全开源智能手表,可全面高精度采集生命体征数据,进行健康检测。(HealthyPi Move)
  • 【Java中的三元运算符】
  • 书法图片自动扣字的批处理
  • leecode 31.下一个排列(Golang)
  • 深度学习100问27:什么是截断的BPTT