真的,Java并发编程基础入门看这个就够了

简介: Java并发编程学习之02Java并发编程入门指南1. Java天生多线程2. Java启动多线程实现方式2.1 实现代码2.2 Thread和Runnable的区别2.3 start和run方法的区别3. Java如何停止线程呢3.1 已弃用方法3.2 推荐使用4. 守护线程5. 优先级6. 线程生命周期代码仓
Java并发编程学习之02Java并发编程入门指南

在这里插入图片描述

1. Java天生多线程

import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;

public class JavaThread {
    public static void main(String[] args) {
        // Java 虚拟机线程管理接口
        ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
        // 线程和线程堆栈信息
        ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);
        // 打印信息
        for (ThreadInfo threadInfo : threadInfos) {
            System.out.println("[" + threadInfo.getThreadId() + "]" + " " + threadInfo.getThreadName());
        }
    }
}

可以看到启动一个类,就有如下几个线程启动了:
在这里插入图片描述

2. Java启动多线程实现方式

这里总结了一下Java启动多线程的方式。
我们先去 java.lang.Thread类里面一探究竟,可以看到下面的注释。
源码里面说一般有 两种方法可以创建新的执行线程。

在这里插入图片描述
在这里插入图片描述
上面已经给出了实例了。

2.1 实现代码

根据官方文档的提示,我们的两种实现线程的方式如下:

public class JavaThreadDemo {
    public static void main(String[] args) {
        // 创建第一种方式对象
        PrimeThread p1 = new PrimeThread(143);
        // 启动线程
        p1.start();

        // 创建第二种方式
        PrimeRun p2 = new PrimeRun(143);
        // 注意这里作为参数
        new Thread(p2).start();
    }
}

/**
 * 第一种方式:继承Thread类
 */
class PrimeThread extends Thread {
    long minPrime;

    PrimeThread(long minPrime) {
        this.minPrime = minPrime;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "===我是继承Thread类实现方式");
    }
}

/**
 * 第二种方式:实现Runnable接口
 */
class PrimeRun implements Runnable {
    long minPrime;

    PrimeRun(long minPrime) {
        this.minPrime = minPrime;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "===我是实现Runnable接口方式");
    }
}

2.2 Thread和Runnable的区别

通过上面的代码演示可以知道,线程最主要的就是Thread类Runnable接口
那他们直接的关系和区别又是什么呢?
Thread类:Java世界一切皆对象,所以对线程的抽象就是Thread类了。
Runnable接口:线程已经有抽象了,而且看接口的源码只有一个run方法,可知他是对任务的抽象,将你想并行执行的任务放到run里面即可。
在这里插入图片描述
如果在网上看到有N中实现方式,其实就是在这两个基础上衍生出来的。

2.3 start和run方法的区别

start() 是启动线程去执行,所以不管创建多线程那种方式都要用start启动。
run() 只是方法执行,并不会新建线程。

import org.junit.Test;

public class StartRunThread {
    /**
     * 1. 测试启动两次
     */
    @Test
    public void test1() {
        MyThread myThread = new MyThread();
        myThread.start();
        // 第二次调用会抛出异常:IllegalThreadStateException
        myThread.start();
    }

    /**
     * 2. 测试run方法
     * 可以看到,run调用就是普通的方法调用,并没有启动线程去执行
     */
    @Test
    public void test2() {
        MyThread myThread = new MyThread();
        myThread.run();
        myThread.run();
    }
}
class MyThread extends Thread {
    @Override
    public void run() {
        super.run();
        System.out.println(Thread.currentThread().getName() + " while running...");
    }
}

3. Java如何停止线程呢

有了开始一定会有终止,就像人生一样~

3.1 已弃用方法

方法名 说明
stop 从1.2版本就已经弃用了,会立即停止线程造成不安全,做到一半就停了会导致资源不会正常释放
suspend 从1.2版本就已经弃用了,挂起线程。它天生就容易死锁。如果目标线程在监视器上持有锁,在关键系统资源被挂起时保护该资源,则在目标线程恢复之前,没有线程可以访问该资源。如果将恢复目标线程的线程试图在调用Resume之前锁定此监视器,则会导致死锁。这种死锁通常表现为“冻结”的进程。
resume 从1.2版本就已经弃用了,恢复挂起线程,和suspend配合使用,容易导致死锁

为什么要弃用stop呢?
可以参考官方文档:
https://docs.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html

3.2 推荐使用

方法名 说明
interrupt 使得线程作为协作,对另一个线程进行中断请求,当线程处理好身后事(比如释放资源)再停止。interrupted判断线程是否被中断。静态类的isInterrupted 判断线程是否被中断,并清除标志位为false
import org.junit.Test;

public class JavaThreadStopDemo {
    static class StopThread2 extends Thread {
        @Override
        public void run() {
            // 输出中断标识位
            System.out.println(Thread.currentThread().getName() + " start interrupt flag === " + this.isInterrupted());
            // 判断是否有中断请求
            while (!this.isInterrupted()) {
                // 输出中断标识位
                System.out.println(Thread.currentThread().getName() + " while interrupt flag === " + this.isInterrupted());
            }
            // 输出中断标识位:Thread-0 end interrupt flag === true
            System.out.println(Thread.currentThread().getName() + " end interrupt flag === " + this.isInterrupted());
        }
    }

    @Test
    public void testStop2() throws InterruptedException {
        StopThread2 stop2 = new StopThread2();
        stop2.start();
        // 延迟指定毫秒,可调节
        Thread.sleep(8);
        stop2.interrupt();
    }
}

4. 守护线程

主线程执行完之后守护线程也会自动消亡。
必须要在start之前设置,如果有finally也不一定执行!

Thread thread = new Thread();
thread.setDaemon(true);

5. 优先级

取值1~10直接,作用不大。

6. 线程生命周期

线程的生命周期分为:新建、就绪、运行、阻塞、消亡,五个状态。

在这里插入图片描述

代码仓

以上全部的代码:
https://gitee.com/jack0240/spring-cloud-demo.git
在这里查看哟~

目录
相关文章
|
15天前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
100 6
|
10天前
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
111 0
|
1月前
|
SQL Java 数据库
2025 年 Java 从零基础小白到编程高手的详细学习路线攻略
2025年Java学习路线涵盖基础语法、面向对象、数据库、JavaWeb、Spring全家桶、分布式、云原生与高并发技术,结合实战项目与源码分析,助力零基础学员系统掌握Java开发技能,从入门到精通,全面提升竞争力,顺利进阶编程高手。
326 0
|
15天前
|
安全 前端开发 Java
从反射到方法句柄:深入探索Java动态编程的终极解决方案
从反射到方法句柄,Java 动态编程不断演进。方法句柄以强类型、低开销、易优化的特性,解决反射性能差、类型弱、安全性低等问题,结合 `invokedynamic` 成为支撑 Lambda 与动态语言的终极方案。
115 0
|
1月前
|
Java
java入门代码示例
本文介绍Java入门基础,包含Hello World、变量类型、条件判断、循环及方法定义等核心语法示例,帮助初学者快速掌握Java编程基本结构与逻辑。
259 0
|
2月前
|
安全 Java 数据库连接
2025 年最新 Java 学习路线图含实操指南助你高效入门 Java 编程掌握核心技能
2025年最新Java学习路线图,涵盖基础环境搭建、核心特性(如密封类、虚拟线程)、模块化开发、响应式编程、主流框架(Spring Boot 3、Spring Security 6)、数据库操作(JPA + Hibernate 6)及微服务实战,助你掌握企业级开发技能。
389 3
|
1月前
|
Java 开发者
Java并发编程:CountDownLatch实战解析
Java并发编程:CountDownLatch实战解析
365 100
|
1月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
134 16
|
1月前
|
NoSQL Java 关系型数据库
超全 Java 学习路线,帮你系统掌握编程的超详细 Java 学习路线
本文为超全Java学习路线,涵盖基础语法、面向对象编程、数据结构与算法、多线程、JVM原理、主流框架(如Spring Boot)、数据库(MySQL、Redis)及项目实战等内容,助力从零基础到企业级开发高手的进阶之路。
180 1
|
1月前
|
前端开发 Java 数据库连接
帮助新手快速上手的 JAVA 学习路线最详细版涵盖从入门到进阶的 JAVA 学习路线
本Java学习路线涵盖从基础语法、面向对象、异常处理到高级框架、微服务、JVM调优等内容,适合新手入门到进阶,助力掌握企业级开发技能,快速成为合格Java开发者。
353 3