Thread 常用API(详细解析)

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: 学习 Thread 的常用API,包括 start、run、join、sleep、interrupt、yield、currentThread 方法的概念、使用方法以及代码实例

start()

启动线程,运行 run 方法中的代码
注意

  • start 方法只是让 线程进入了 就绪,而不是马上运行,需要等待CPU的时间片
  • 一个线程只能调用一次 start,否则会出现 IllegalThreadStateException

代码实例

        Thread t1=new Thread(() -> {
   
            System.out.println("线程1 运行");
        });
        Thread t2=new Thread(() -> {
   
            System.out.println("线程2 运行");
        });

        t1.start();
        t2.start();

上面代码的的运行结果可能是

线程2 运行
线程1 运行

虽然 线程1 比 线程2 更早进入就绪态,但是 线程2 比 线程1 更早获取到CPU时间片,因此更早执行

run()

在该方法中定义线程要完成的任务

以下是Runnable接口的源码

@FunctionalInterface
public interface Runnable {
   
    public abstract void run();
}

可以看到加了 @FunctionalInterface ,是函数式接口,并且只有一个run方法

我们看Thread源码,发现Thread的run方法就是来源于 Runnable 接口

public class Thread implements Runnable

我们可以直接重写 Thread 中的run方法,比如

        Thread t3 = new Thread(){
   
            @Override
            public void run() {
   
                System.out.println("线程3 运行");
            }
        };
        t3.start();

也可以继承 Thread 类后再重写

public class MyThread extends Thread {
   
    @Override
    public void run() {
   
        System.out.println("MyThread...run...");
    }    
    public static void main(String[] args) {
   
        // 创建MyThread对象
        MyThread t1 = new MyThread() ;
        MyThread t2 = new MyThread() ; 
    }

}

观察Thread源码,发现存在Runnable属性

    /* What will be run. */
    private Runnable target;

因此,也可以在构造 Thread 对象时传递 Runnable 参数,则线程启动后会调用 Runnable 中的 run 方法

代码实例

        Thread t1=new Thread(() -> {
   
            System.out.println("线程1 运行");
        });
        Thread t2=new Thread(() -> {
   
            System.out.println("线程2 运行");
        });

        t1.start();
        t2.start();

在上面的代码中,调用的 Thread 构造方法,如下

    public Thread(Runnable target) {
   
        init(null, target, "Thread-" + nextThreadNum(), 0);
    }

我们使用Lambda表达式实现了Runnable接口的run方法

可以用一句话概括,如果 Thead 类上的Runnable属性不为null,则执行该Runnable属性的run方法,否则执行Thread自己的run方法

join() 和 join(long n)

join() -- 等待线程运行结束
join(long n) -- 等待线程运行结束,最多等待 n 毫秒

        Thread t3 = new Thread(){
   
            @Override
            public void run() {
   
                try {
   
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
   
                    e.printStackTrace();
                }
            }
        };
        t3.start();

        t3.join();

        System.out.println("main 继续执行");

执行上面的代码会发现,无论如何都会等待至少10秒才会输出 "main 继续执行"

sleep(long n)

sleep是Thread的静态方法

作用是:让当前执行的线程休眠n毫秒,休眠时让出 cpu 的时间片给其它线程

上面的代码实例就已经使用到 sleep 方法

哪个线程调用了 Thread.sleep(10000) ,哪个线程睡眠

比如在上面的代码实例中,线程3 会睡眠 10 秒,而 主线程 并不会睡眠

另外

  • 睡眠结束后的线程未必会立刻得到执行
  • 其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时 sleep 方法会抛出 InterruptedException
  • 建议用 TimeUnit 的 sleep 代替 Thread 的 sleep来获得更好的可读性 (TimeUnit 的 sleep方法与 Thread的sleep方法相同)

interrupt()

interrupt 打断线程

无论线程处在阻塞(sleep、wait、join)还是运行状态,都可以被打断

如果被打断线程正在 sleep、wait、join 会导致被打断的线程抛出 InterruptedException,并清除 打断标记 ;如果打断的正在运行的线程,则会设置 打断标记 ;

interrupt 是非静态方法,需要打断哪个线程,就调用那个线程的 interrupt方法

代码实例

    private static void test1() throws InterruptedException {
   
        Thread t1 = new Thread(()->{
   
            try {
   
                Thread.sleep(1000);
            } catch (InterruptedException e) {
   
                e.printStackTrace();
            }
        }, "t1");
        t1.start();
        Thread.sleep(500);
        t1.interrupt();
    }

yield()

sleep 能使线程让出 CPU时间片

而 yield方法 同样 能使线程让出CPU时间片

但是 调用 yield 方法时,线程不一定会马上让出CPU,这取决于操作系统的任务调度器

而且 sleep 方法是让线程从 Running 进入 Timed Waiting 状态(阻塞),yield是让当前线程从 Running 进入 Runnable 就绪状态

yield方法也是个静态方法

currentThread()

public static native Thread currentThread();

可以看到currentThread也是个静态方法,并且返回值是Thread

用法 -- 在哪个线程中调用 Thread.currentThread ,就会返回当前线程的 Thread 对象,有点类似 this 关键字

目录
相关文章
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
87 2
|
2天前
|
JSON 供应链 搜索推荐
淘宝APP分类API接口:开发、运用与收益全解析
淘宝APP作为国内领先的购物平台,拥有丰富的商品资源和庞大的用户群体。分类API接口是实现商品分类管理、查询及个性化推荐的关键工具。通过开发和使用该接口,商家可以构建分类树、进行商品查询与搜索、提供个性化推荐,从而提高销售额、增加商品曝光、提升用户体验并降低运营成本。此外,它还能帮助拓展业务范围,满足用户的多样化需求,推动电商业务的发展和创新。
17 5
|
3天前
|
API 数据处理 开发者
获取淘宝分类详情:深入解析taobao.cat_get API接口
淘宝开放平台推出的`taobao.cat_get` API接口,帮助开发者和商家获取淘宝、天猫的商品分类详情。该接口支持获取类目列表、属性及父类目信息,通过指定分类ID(cid)实现精准查询,并提供灵活的参数设置和高效的数据处理。使用流程包括注册账号、创建应用、获取App Key/Secret、构造请求、发送并解析响应。示例代码展示了如何用Python调用此API。开发者可借此为电商项目提供数据支持。
|
19天前
|
数据采集 JSON API
如何利用Python爬虫淘宝商品详情高级版(item_get_pro)API接口及返回值解析说明
本文介绍了如何利用Python爬虫技术调用淘宝商品详情高级版API接口(item_get_pro),获取商品的详细信息,包括标题、价格、销量等。文章涵盖了环境准备、API权限申请、请求构建和返回值解析等内容,强调了数据获取的合规性和安全性。
|
10天前
|
安全 API 数据安全/隐私保护
速卖通AliExpress商品详情API接口深度解析与实战应用
速卖通(AliExpress)作为全球化电商的重要平台,提供了丰富的商品资源和便捷的购物体验。为了提升用户体验和优化商品管理,速卖通开放了API接口,其中商品详情API尤为关键。本文介绍如何获取API密钥、调用商品详情API接口,并处理API响应数据,帮助开发者和商家高效利用这些工具。通过合理规划API调用策略和确保合法合规使用,开发者可以更好地获取商品信息,优化管理和营销策略。
|
18天前
|
JSON 自然语言处理 Java
OpenAI API深度解析:参数、Token、计费与多种调用方式
随着人工智能技术的飞速发展,OpenAI API已成为许多开发者和企业的得力助手。本文将深入探讨OpenAI API的参数、Token、计费方式,以及如何通过Rest API(以Postman为例)、Java API调用、工具调用等方式实现与OpenAI的交互,并特别关注调用具有视觉功能的GPT-4o使用本地图片的功能。此外,本文还将介绍JSON模式、可重现输出的seed机制、使用代码统计Token数量、开发控制台循环聊天,以及基于最大Token数量的消息列表限制和会话长度管理的控制台循环聊天。
119 7
|
1月前
|
机器学习/深度学习 搜索推荐 API
淘宝/天猫按图搜索(拍立淘)API的深度解析与应用实践
在数字化时代,电商行业迅速发展,个性化、便捷性和高效性成为消费者新需求。淘宝/天猫推出的拍立淘API,利用图像识别技术,提供精准的购物搜索体验。本文深入探讨其原理、优势、应用场景及实现方法,助力电商技术和用户体验提升。
|
1月前
|
监控 数据管理 测试技术
API接口自动化测试深度解析与最佳实践指南
本文详细介绍了API接口自动化测试的重要性、核心概念及实施步骤,强调了从明确测试目标、选择合适工具、编写高质量测试用例到构建稳定测试环境、执行自动化测试、分析测试结果、回归测试及集成CI/CD流程的全过程,旨在为开发者提供一套全面的技术指南,确保API的高质量与稳定性。
|
2月前
|
JSON API 数据格式
二维码操作[二维码解析基础版]免费API接口教程
此接口用于解析标准二维码内容,支持通过BASE64编码或远程图片路径提交图片。请求需包含用户ID、用户KEY、图片方式及图片地址等参数,支持POST和GET方式。返回结果包括状态码和消息内容,适用于图片元素简单的二维码解析。
|
24天前
|
供应链 搜索推荐 数据挖掘
1688搜索词推荐API接口:开发应用与收益全解析
在电商数据驱动时代,1688搜索词推荐API接口为开发者、供应商及电商从业者提供强大工具,优化业务流程,提升竞争力。该接口基于1688平台的海量数据,提供精准搜索词推荐,助力电商平台优化搜索体验,提高供应商商品曝光度与销售转化率,同时为企业提供市场分析与商业洞察,促进精准决策与成本降低。通过集成此API,各方可实现流量增长、销售额提升及运营优化,推动电商行业的创新发展。
31 0

热门文章

最新文章

推荐镜像

更多