线程创建与管理

简介: 线程创建与管理

在Java中创建和管理线程主要有两种方式:通过实现Runnable接口或继承Thread类。下面我将详细解释这两种方法,并提供一些示例代码。

方法一:实现Runnable接口

实现Runnable接口是创建线程的首选方式,因为它允许我们避免单继承的局限性。要实现Runnable接口,我们需要重写run方法,该方法定义了线程要执行的任务。

java复制代码

 

public class MyRunnable implements Runnable {

 

@Override 

 

public void run() {

 

// 线程要执行的代码

 

System.out.println("线程正在运行: " + Thread.currentThread().getName());

 

}

 

}

然后,我们可以创建一个Thread对象,将Runnable实例作为参数传递给Thread的构造函数,并调用start方法来启动线程。

java复制代码

 

public class ThreadDemo {

 

public static void main(String[] args) {

 

// 创建Runnable实例

 

MyRunnable myRunnable = new MyRunnable();

 

 

 

// 创建Thread对象,并将Runnable实例传递给它

 

Thread thread = new Thread(myRunnable);

 

 

 

// 启动线程

 

thread.start();

 

 

 

// 主线程继续执行

 

System.out.println("主线程执行完毕");

 

}

 

}

方法二:继承Thread

另一种创建线程的方法是直接继承Thread类并重写run方法。

java复制代码

 

public class MyThread extends Thread {

 

@Override 

 

public void run() {

 

// 线程要执行的代码

 

System.out.println("线程正在运行: " + Thread.currentThread().getName());

 

}

 

}

然后,我们可以直接创建MyThread的实例,并调用其start方法来启动线程。

java复制代码

 

public class ThreadDemo {

 

public static void main(String[] args) {

 

// 创建Thread子类实例

 

MyThread myThread = new MyThread();

 

 

 

// 启动线程

 

myThread.start();

 

 

 

// 主线程继续执行

 

System.out.println("主线程执行完毕");

 

}

 

}

线程管理

在Java中,线程的管理包括线程的启动、等待线程结束、线程的强制停止等。

· 启动线程:通过调用线程的start()方法启动线程。

· 等待线程结束:可以调用线程的join()方法,让当前线程等待该线程结束后再继续执行。

· 强制停止线程:虽然不推荐直接停止线程(因为它可能导致不可预测的行为),但如果你确实需要这样做,可以调用stop()方法。不过,从Java 1.5开始,stop()方法已被废弃,建议使用更安全的interrupt()方法,它会在目标线程中设置一个中断标志,线程可以检查这个标志来决定是否应该停止执行。

java复制代码

 

// 强制停止线程(不推荐)

 

thread.stop();

 

 

 

// 更安全的方式是使用interrupt()

 

thread.interrupt();

run方法内部,线程可以通过检查Thread.interrupted()Thread.isInterrupted()来响应中断。

线程状态

Java中的线程有五种状态:新建(New)、可运行(Runnable)、阻塞(Blocked)、等待(Waiting)、超时等待(Timed Waiting)和终止(Terminated)。线程的状态可以通过Thread类的getState()方法获取。

线程同步与通信

当多个线程需要访问共享资源时,需要使用同步机制来确保线程安全。Java提供了synchronized关键字和wait()notify()notifyAll()等方法来实现线程同步和通信。

线程池

对于大量并发的线程,使用线程池(ExecutorService)是一个更好的选择。线程池可以复用线程,减少创建和销毁线程的开销。Java中的Executors类提供了创建线程池的静态方法。

示例:使用线程池

java复制代码

 

import java.util.concurrent.ExecutorService;

 

import java.util.concurrent.Executors;

 

 

 

public class ThreadPoolDemo {

 

public static void main(String[] args) {

 

// 创建一个固定大小的线程池

 

ExecutorService executor = Executors.newFixedThreadPool(5);

 

 

 

for (int i = 0; i < 10; i++) {

 

Runnable worker = new MyRunnable();

 

executor.execute(worker); // 提交任务给线程池执行

 

}

 

 

 

executor.shutdown(); // 关闭线程池

 

while (!executor.isTerminated()) {

 

}

 

 

 

System.out.println("所有任务执行完毕");

 

}

 

}

 

目录
相关文章
|
2天前
|
云安全 人工智能 自然语言处理
|
7天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
659 17
|
10天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
728 57
Meta SAM3开源:让图像分割,听懂你的话
|
7天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
328 116
|
10天前
|
机器学习/深度学习 人工智能 自然语言处理
AgentEvolver:让智能体系统学会「自我进化」
AgentEvolver 是一个自进化智能体系统,通过自我任务生成、经验导航与反思归因三大机制,推动AI从“被动执行”迈向“主动学习”。它显著提升强化学习效率,在更少参数下实现更强性能,助力智能体持续自我迭代。开源地址:https://github.com/modelscope/AgentEvolver
482 37
|
22天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
1天前
|
Rust 安全
掌握Rust文件读取(从零开始的IO操作指南)
本教程手把手教你用Rust读取文件,涵盖`read_to_string`一次性读取和`BufReader`逐行高效读取,适合初学者掌握安全、高效的Rust文件操作,助你轻松入门系统编程。
147 113