【Java线程基础操作详解】

Java线程基础操作详解

    • 前言
    • [1. 线程创建](#1. 线程创建)
      • [1.1 继承Thread类](#1.1 继承Thread类)
      • [1.2 实现Runnable接口](#1.2 实现Runnable接口)
      • [1.3 匿名内部类](#1.3 匿名内部类)
      • [1.4 lambda表达式](#1.4 lambda表达式)
    • [2. 线程中断](#2. 线程中断)
    • [3. 线程等待](#3. 线程等待)
    • [4. 线程休眠](#4. 线程休眠)

前言

在Java编程里,线程是实现多任务处理的关键概念。本文会详细讲解Java中线程的创建、中断、等待以及休眠等操作,通过丰富代码示例和详细解释,助力你理解相关知识。

1. 线程创建

1.1 继承Thread类

创建一个类继承Thread 类,并重写其run 方法,以此定义线程的执行逻辑。run 方法是线程入口,线程启动时,run 方法自动执行,无需手动调用。start 方法用于真正创建并启动线程(由JVM调用系统API完成线程创建),且start方法只能调用一次(一个线程仅能创建一次)。

示例代码如下:

java 复制代码
class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("Thread类");
    }
}

public class Main {
    public static void main(String[] args) {
        // 创建线程对象
        Thread t = new MyThread();
        // 启动线程
        t.start();
    }
}

1.2 实现Runnable接口

创建一个实现Runnable 接口的类,重写其run 方法。这里创建的实现类对象实际上是一个任务,并非直接创建线程。把该任务对象传递给Thread类的构造函数,从而创建线程对象。这种方式符合解耦合原则,在实际开发中更为常用,因为它将任务逻辑与线程本身分离,修改任务时不影响线程其他部分,提升了代码可维护性。

示例代码如下:

java 复制代码
// 实现Runnable接口的类
class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("runnable接口");
    }
}

public class Demo1 {
    public static void main(String[] args) {
        // 创建线程对象
        Thread t = new Thread(new MyRunnable());
        // 启动线程
        t.start();
    }
}

1.3 匿名内部类

使用匿名内部类方式能更简洁地创建线程,无需显式创建Thread 子类或Runnable实现类。这种方式可直接在代码中定义线程执行逻辑,提高代码紧凑性。

示例代码如下:

java 复制代码
public class Demo2 {
    public static void main(String[] args) {
        // 匿名内部类------继承Thread类
        Thread t1 = new Thread() {
            @Override
            public void run() {
                System.out.println("匿名内部类------Thread类");
            }
        };
        t1.start();

        // 匿名内部类------实现Runnable接口
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("匿名内部类------Runnable接口");
            }
        };
        Thread t2 = new Thread(runnable);
        t2.start();
    }
}

1.4 lambda表达式

使用lambda表达式是对实现Runnable接口的匿名内部类的简化写法。它通过更简洁语法定义线程执行逻辑,让代码更清晰易读。

示例代码如下:

java 复制代码
public class Demo3 {
    public static void main(String[] args) {
        // 使用lambda表达式实现Runnable接口
        Thread t = new Thread(() -> {
            System.out.println("lambda ");
        });
        t.start();
    }
}

2. 线程中断

在Java中,线程中断主要涉及以下几个方法:

方法名 描述
interrupt() 中断对象关联的线程。若线程正在阻塞,则以异常形式通知;否则设置中断标识位。
isInterrupted() 判断对象关联的线程的中断标识位是否设置,调用后不清除该标志位。
interrupted() 判断当前线程的中断标识位是否设置,调用后会清除该标识位。

以下是一个线程中断的示例代码:

java 复制代码
public class Demo5 {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                if (!Thread.currentThread().isInterrupted()) {
                    System.out.println("线程执行中...");
                    System.out.println("线程是否中断:" + Thread.currentThread().isInterrupted());
                    Thread.currentThread().interrupt();
                }
            }
        });
        t.start();
        t.join();
        System.out.println("线程是否中断:" + t.isInterrupted());
    }
}

3. 线程等待

在Java中,可使用join()方法等待一个线程执行完毕。join()方法有以下几种重载形式:

方法名 描述
join() 等待线程结束。
join(long mills) 等待线程结束,最多等待mills毫秒。
join(long mills, int nanos) 等待线程结束,提供更高时间精度,最多等待mills 毫秒和nanos纳秒。

以下是不使用join()方法和使用join()方法的示例对比:
不使用join()方法时:

java 复制代码
public class Demo6 {
    public static void main(String[] args) {
        // 创建一个线程
        Thread t = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                System.out.println("t线程执行");
            }
        });
        // 启动线程
        t.start();
        System.out.println("主线程结束");
    }
}

使用join(long mills)方法时:

java 复制代码
public class Demo6 {
    public static void main(String[] args) {
        // 创建一个线程
        Thread t = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                System.out.println("t线程执行");
            }
        });
        // 启动线程
        t.start();
        // 等待t线程运行结束
        try {
            **t.join()**;
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("主线程结束");
    }
}

使用join(long mills)方法并设置较短等待时间时:

java 复制代码
public class Demo6 {
    public static void main(String[] args) {
        // 创建一个线程
        Thread t = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                System.out.println("t线程执行");
            }
        });
        // 启动线程
        t.start();
        // 等待t线程运行结束
        try {
            **t.join(1)**;
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("主线程结束!!!!");
    }
}

4. 线程休眠

在Java中,可使用sleep()方法让当前线程暂停执行一段时间。sleep()方法有以下两种重载形式:

方法名 描述
sleep(long mills) 使当前线程休眠mills毫秒。
sleep(long mills, int nanos) 使当前线程休眠,提供更高精度,可休眠mills 毫秒和nanos纳秒。

以下是一个线程休眠的示例代码:

java 复制代码
public class Demo7 {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                System.out.println("线程t");
                try {
                    **Thread.sleep(1000)**;
                    // 线程休眠1秒
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        t.start();
    }
}

通过本文介绍,希望你对Java中线程的基本操作有更深入理解,能在实际开发中灵活运用这些知识实现多线程编程。

相关推荐
工具派3 分钟前
Word文档太大怎么拆分?段落结构与两种拆法的边界实测
开发语言·c#·word
曹牧7 分钟前
Spring MVC : Controller 层URL划分
java·运维·服务器·前端
wjcroom18 分钟前
实现老型号HP打印机手机无线打印的一些步骤和方法
开发语言·智能手机·php
潜龙952721 分钟前
需求文档一键变测试用例:手工用例智能生成平台
开发语言·c#
卓怡学长22 分钟前
w203基于springboot钢材仓库管理系统的设计与实现
java·spring boot·spring·intellij-idea
sunburn-24 分钟前
Java 排序算法详细教学:从冒泡排序到快速排序
java·开发语言·数据结构·ide·算法
鹤卿12328 分钟前
「iOS」GCD
开发语言·ios·objective-c
我是小白呀29 分钟前
编排还是事件协作?用 AcmeFlow 讲清企业 Workflow 的控制权
java·开发语言
ACP广源盛1392462567332 分钟前
接口适配方案选型|GSV6125@ACP HDMI2.0 转 Type‑C/DP1.4 桥接芯片工程评估
大数据·c语言·开发语言·硬件架构·硬件工程·国产芯片
深入云栈42 分钟前
Netty 4.2.x 源码深度解析 (十四):KQueue 传输 —— macOS 高性能 IO 的 Netty 实现
java·后端