java:线程的几种创建写法

Java创建线程的七种方法,全网最全面总结~ 属于基础的面试问题,一定要能够回答全哦~ 阅读详情

一、总结

项目语法(自用的伪代码,省去了关键字和数据类型)细节
1. 直接任务类继承 ThreadTask -继承-> Thread
task.start()
2. 任务类实现 Runnable / Callable,由 Thread 调用

Runnable:
Task -实现-> Runnable
t = thread(task)
t.start()

Callable:
Task -实现-> Callable
futureTask = FutureTask<>(task)
t = Thread(futureTask)
t.start()

Runnable:无返回值Callable:- 有返回值(call)- 能抛异常- 不能直接给 Thread,用 FutureTask 包装
3. 任务类实现 Runnable / Callable,由 ExecutorService 调用

Runnable:
Task -实现-> Runnable
pool = ExecutorService(固定线程池/其他类型)
pool.execute(task)

Callable:
Task -实现-> Callable
pool = ExecutorService(固定线程池/其他类型)
future = pool.submit(task)
result = future.get()  // 获取返回值

Runnable:无返回值Callable:- 有返回值(call)- 能抛异常

二、具体写法

1.直接继承Thread

要点:直接写线程类并继承Thread类,重写run(),创建该线程对象,调用start()

class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("线程运行中!");
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread t = new MyThread();
        t.start();  // 启动线程,执行 run()
    }
}
2.实现接口
2.1 实现Runnable接口

要点:先写任务类实现Runnable接口,重写run()  -->  创建线程对象,传入任务对象,调用start()启动线程

完整版

class MyTask implements Runnable {
    @Override
    public void run() {
        System.out.println("线程运行中!");
    }
}

public class Main {
    public static void main(String[] args) {
        MyTask task = new MyTask();
        Thread t = new Thread(task);
        t.start();  // 启动线程
    }
}

简化版:匿名内部类(一种简写方式,不需要单独创建类,而是在内部创建匿名类)

public class Main {
    public static void main(String[] args) {
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("匿名内部类 Runnable 线程运行中!");
            }
        });
        t.start();  // 启动线程
    }
}

更简化版:lambda表达式(一种基于上面匿名内部类,更为简写的方式)

public class Main {
    public static void main(String[] args) {
        new Thread(() -> System.out.println("Lambda Runnable 线程运行中!")).start();
    }
}
2.2 实现Callable接口

要点:任务类实现Callable接口,重写call()  -->  创建futuretask对象,包装任务类  -->  创建线程对象,传入futuretask对象为参数,调用start()启动线程

完整版

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

public class Main {
    public static void main(String[] args) throws Exception {
        // 1. 定义 Callable 任务类
        class MyTask implements Callable<Integer> {
            @Override
            public Integer call() throws Exception {
                System.out.println("Callable任务执行中...");
                Thread.sleep(1000);
                return 123;
            }
        }

        // 2. 创建任务对象
        MyTask task = new MyTask();

        // 3. 用 FutureTask 包装 Callable
        FutureTask<Integer> futureTask = new FutureTask<>(task);

        // 4. 创建 Thread 并启动
        Thread t = new Thread(futureTask);
        t.start();

        // 5. 获取返回值
        Integer result = futureTask.get();
        System.out.println("返回值:" + result);
    }
}

简化版

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

public class Main {
    public static void main(String[] args) throws Exception {
        FutureTask<Integer> futureTask = new FutureTask<>(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                System.out.println("Callable任务执行中...");
                Thread.sleep(1000);
                return 123;
            }
        });

        Thread t = new Thread(futureTask);
        t.start();

        Integer result = futureTask.get();
        System.out.println("返回值:" + result);
    }
}

更简化版

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

public class Main {
    public static void main(String[] args) throws Exception {
        FutureTask<Integer> futureTask = new FutureTask<>(
            (Callable<Integer>) () -> {
                System.out.println("Callable任务执行中...");
                Thread.sleep(1000);
                return 123;
            }
        );

        new Thread(futureTask).start();

        System.out.println("返回值:" + futureTask.get());
    }
}
3 线程池
3.1 Runable + 线程池写法
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {
    public static void main(String[] args) {
        // 1. 创建线程池
        ExecutorService pool = Executors.newFixedThreadPool(2);

        // 2. 提交 Runnable 任务
        pool.execute(() -> System.out.println("线程池中的任务运行中!"));

        // 3. 关闭线程池
        pool.shutdown();
    }
}
3.2 Callable + 线程池写法
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class Main {
    public static void main(String[] args) throws Exception {
        // 1. 创建 Callable 任务
        Callable<Integer> task = () -> {
            System.out.println("Callable 任务执行中");
            return 123;
        };

        // 2. 创建线程池
        ExecutorService pool = Executors.newSingleThreadExecutor();

        // 3. 提交任务,返回 Future
        Future<Integer> future = pool.submit(task);

        // 4. 获取返回值
        Integer result = future.get();
        System.out.println("返回值:" + result);

        // 5. 关闭线程池
        pool.shutdown();
    }
}

sysbench安装(在线&离线) sysbench下载、安装、编译和异常处理方法 阅读详情

相关推荐

Type-C连接中的CC引脚:Rp与Rd电阻的识别与供电模式选择

本文深入解析Type-C接口中CC引脚的核心功能,包括Rp与Rd电阻的识别原理及供电模式选择机制。通过详细的分压计算和实战案例,揭示Type-C设备如何通过CC引脚实现方向检测、角色识别和供电协商,为硬件设计提供关键指导。

weixin_30616969的博客 340

Java多线程的几种常见写法

多线程的几种写法。

2302_80113478的博客 573

UI-TARS本地部署

UI-TARS是一个用于本地部署的交互控制模型,支持桌面应用的自动化操作。部署步骤包括:首先,从官方GitHub仓库下载项目源码和模型checkpoint;其次,使用vLLM框架进行本地模型部署,启动API服务;最后,通过客户端调用API实现功能。部署过程中可能遇到pynvml模块或模型配置问题,提供了相应的解决方案。此外,还支持通过UI-TARS-Desktop客户端进行本地桌面应用的交互控制。整体流程旨在帮助用户快速实现UI-TARS的本地部署与应用。

DYF的博客 2530

java 多线程的三种写法

▌多线程是什么 运行一个程序叫做一个线程,运行过程中时处理多个任务,这些任务叫做线程(比如同时播放画面和声音) 注:真正的多线程需要多核CPU同时处理多个线程,单核的是伪多线程(单核同一时间只能处理一个线程,但是线程之间切换很多,毫秒级,所以看起来像是在同时处理) ▌一、继承类Rubbable 创建一个类TestThread 继承父类Thread 重写方法Run new对象TestThread 开启多个线程对象名.start() public class TestThread extends Thr

8930

保姆级教程:用Multisim仿真快速上手二极管、MOSFET和IGBT的开关特性

本文提供了一份详细的Multisim仿真教程,帮助读者快速掌握二极管、MOSFET和IGBT的开关特性。通过搭建实验电路、观察波形特征和参数影响分析,深入解析了反向恢复过程、米勒平台现象和拖尾电流效应。适合电力电子初学者和工程师通过仿真建立直观理解,提升电路设计能力。

weixin_29290863的博客 498

实战分享:如何用本地替换和插桩调试搞定Kasada最新版x-kpsdk-cd环境检测

本文深入解析Kasada最新版x-kpsdk-cd环境检测机制,提供动态请求拦截、本地替换和函数插桩等实战调试策略。通过Proxy保护破解、关键函数断点调试和环境检测对抗方案,帮助逆向工程师有效应对从280位扩展到294位的加密数组挑战,实现高效补环境调试。

weixin_29251567的博客 568

java 线程 写法_java中创建线程的三种方式

1.继承Thread类创建线程;2.实现Runnable接口;3.实现Callable接口的类的实例,用FutureTask类来包装。一般推荐的是通过实现接口的方式,相对灵活一点,具体看情况,第3中写法相对麻烦一点,如果没有那个需求就没必要那么写。实现方法比较简单,示例代码如下:主程序测试类:package concurrent.createThead;import java.util.concu...

weixin_31002029的博客 410

电源完整性必看!用SIwave提取PDN阻抗曲线的3个关键设置与常见报错解决

本文深入探讨了在SIwave中进行电源完整性(PI)仿真时,提取PDN阻抗曲线的三个核心设置要点。重点解析了端口阻抗设为0.1欧姆的物理意义与SYZ参数仿真中的阻抗匹配原则,并提供了针对常见收敛性问题和模型误差的实战排查思路,旨在帮助工程师获得更精确可靠的仿真结果,为去耦电容优化提供依据。

b9c0d的博客 350

Java创建多线程的五种写法

其实就是在Thread里面多了一个new Runnable。(线程和主程序运行结果可能会调换顺序)​​​​​​​。(线程和主程序运行结果可能会调换顺序)​​​​​​​。(线程和主程序运行结果可能会调换顺序)​​​​​​​。(线程和主程序运行结果可能会调换顺序)​​​​​​​。(线程和主程序运行结果可能会调换顺序)

qq_62718027的博客 2929

S32DS 3.5.8离线包怎么用?保姆级教程教你手动安装S32K3开发环境(附资源下载)

本文详细介绍了S32DS 3.5.8离线包的安装方法,适用于S32K3开发环境的手动搭建。从资源获取、完整性验证到分步安装指南,提供了全面的离线部署解决方案,特别适合军工/车企内网开发等场景。文章还包含版本选择建议、常见问题排查及团队协作方案,帮助开发者高效完成环境配置。

weixin_30471561的博客 477

【虚幻引擎UE】UE5 四步骤实现AI漫游与对话行为(含工程源码)

【虚幻引擎UE】UE5 四步骤实现AI漫游与对话行为(含工程源码)

灵境引路人 3227

java线程的写法_8.1 线程的创建:创建线程的几种写法

嗨,你好,下面我们一起来学习线程的创建。线程呢, 它是跟进程是相对的。那么所谓的 进程呢,就是我们一个程序它在一直的执行, 当然包括这个程序里面的代码, 以及内存里面的数据等等,这一次执行过程 就是进程。那么线程呢实际上是一个进程里面 它的单个的顺序流程控制。 或者我们简单地说就是一个程序里面有多个任务, 但是这几个多个任务它们之间是可以并发地运行的,比如说一个程序里面它既要 边下载,...

weixin_34508986的博客 520

NVIDIA AI 学习与认证指南:从入门到精通

NVIDIA的AI学习与认证体系,凭借其先进的技术背景、丰富的课程资源以及强大的行业认可度,已成为AI学习者和从业者的宝贵资源。通过深入学习NVIDIA的课程和获得认证,学习者可以快速掌握最前沿的AI技术,提升自己的职业竞争力。从基础课程到专业认证,NVIDIA为不同层次的学习者提供了量身定制的学习资源,帮助他们掌握AI的核心技能,提升职业竞争力。是其中的一个亮点,它结合了信息检索与生成式AI的能力,使AI可以从外部知识库中实时提取信息,生成更具深度和准确性的内容。,帮助学习者快速掌握该领域的核心技术。

高校图书馆高级系统架构师/研究馆员,推动高校AI从概念演示到可评审、可交付、可运维:路线图与立项评审、PoC交付、评测回归与上线运维(Baseline/Eval/Ops)。 1876

【面试宝典】Java中创建线程池的几种方式以及区别

线程池类型线程数量控制特点适用场景固定数量固定线程数,适合稳定的任务并发固定并发任务自动扩展动态扩展,空闲线程自动回收,适合任务短小但并发量不稳定短期的异步并发任务单一线程单线程顺序执行任务,保证顺序顺序执行的任务可控核心线程数支持定时或周期性任务定时任务、周期性任务默认 CPU 核数基于任务拆分并行处理,提高多核 CPU 利用率并行计算和多任务的分解。

Venus's Blog 2万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

java创建线程的方式到底有几种?(详解)

java实现多线程的两种方式

zhenghuishengq的博客 9882

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java多线程——创建线程的几种方式

线Java多线程——创建线程的几种方式

Arya的博客,专注后端领域 1308

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Java 中创建线程几种方式

在Java中,线程(Thread)是程序执行的最小单元,它允许程序在同一时间执行多个任务。Java中的线程可以由Thread类创建,也可以通过实现Runnable接口或Callable接口创建。: 线程对象已经被创建,但还没有调用start()方法。: 线程已经调用了start()方法,但还没有获得CPU时间片执行。可运行状态包括了操作系统线程的就绪(Ready)和运行(Running)状态。: 线程因为等待监视器锁而被阻塞,无法继续执行。: 线程通过调用wait()join()

精神小牛马 1471

Java 中创建线程的几种方式

继承Thread类:适用于简单的任务,代码简单,但不够灵活。实现Runnable接口:适合复杂的任务逻辑,线程和任务解耦,灵活性较高。使用Callable和:适合需要返回结果或需要线程池管理的任务。使用线程池创建:适合多线程并发的场景。

萌萌白白的博客 640

Java多线程的几种写法

Java多线程的在开发中用到的很多,简单总结一下几种写法,分别是继承Thread方法,实现Runnable接口,实现Callable接口; 继承Thread方法 class TestThread extends Thread{ String name; public TestThread(String name){ this.name=name; } ...

Java_No2的博客 5022

java创建线程的几种方式

和Runnable接口类似但又不一样,Callable接口提供了一个call()方法来作为线程的执行体,call()方法比run()方法功能要更加强大,call()方法可以有返回值,也可以声明抛出异常(前两种如果要抛异常只能通过try,catch来实现)。追踪线程池的源代码,其实用线程池创建线程的本质最终也是使用 new Thread(target) 方法创建的线程,只是将创建的这些线程放入一个池子中进行管理了。方法:1.新创建Callable接口的实现类,并实现call()方法。

没有所谓的命运,只有不同的选择! 958

Java 创建线程池的几种方式

java线程池创建的几种方式和运用

精神小牛马 7807

创建线程几种方式

创建线程的几种方式: 方式1:通过继承Thread类创建线程 步骤:1.定义Thread类的子类,并重写该类的run方法,该方法的方法体就是线程需要执行的任务,因此run()方法也被称为线程执行体 2.创建Thread子类的实例,也就是创建了线程对象 3.启动线程,即调用线程的start()方法 方式2:通过实现Runnable接口创建线程 步骤:1.定义Runnable接口的实现类,一样要重写...

刘涛的博客 3967

几种线程的创建方式

本文将展示几种主要的Java继承Thread实现Runnable接口(推荐)实现Callable接口+Future(带线程返回值)Lamda 表达式创建自定义线程池创建这些线程的创建是实现了。

weixin_45512348的博客 1107

【总结篇】java多线程,新建线程有几种写法,以及每种写法的优劣势

java多线程,新建线程有几种写法,以及每种写法的优劣势

橙-极纪元-JJYCheng 1058

Java中创建线程的几种方式

在Java中创建线程有4种,分别是继承Thread类 实现Runnable接口 使用Callable接口 使用线程池。

weixin_53616401的博客 1192

多线程的几种创建方式

先说下线程的几种状态(5种): 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(); 就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行; 运行状态...

小白菜 7212
上一篇: python:模板方法模式
下一篇: java:类对象(class对象)——类是类,对象是对象,类对象是什么鬼?“类对象”和“类的对象”是一样的吗?
talenteddriver
博客等级 码龄5年 12粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值