详解Java多线程基础

 更新时间:2026年05月27日 10:03:31   作者:爱滑雪的码农  
这篇文章给大家介绍了Java多线程基础知识,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

线程创建两种方式

方式 1:继承 Thread 类

继承后重写run(),调用start()启动线程

// 1.定义线程类
class MyThread extends Thread{
    @Override
    public void run() {
        // 线程执行任务
        for (int i = 0; i < 5; i++) {
            System.out.println("线程执行:"+i);
        }
    }
}
// 测试
public class ThreadDemo {
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        t1.start(); // 启动线程,自动执行run方法
    }
}

方式 2:实现 Runnable 接口

避免单继承限制,更常用

// 1.实现接口
class MyRunnable implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("任务运行:"+i);
        }
    }
}
public class RunnableDemo {
    public static void main(String[] args) {
        MyRunnable task = new MyRunnable();
        Thread t2 = new Thread(task);
        t2.start();
    }
}

如何实现多线程

// 1.定义线程类
class MyThread extends Thread{
    @Override
    public void run() {
        // 线程执行任务
        for (int i = 0; i < 5; i++) {
            // 加上当前线程名字,你能看清谁在跑
            System.out.println(getName() + " 执行:"+i);
        }
    }
}
// 测试
public class ThreadDemo {
    public static void main(String[] args) {
        // 创建 2 个线程
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();
        // 给线程起名字
        t1.setName("线程A");
        t2.setName("线程B");
        // 启动 → 这才是多线程!
        t1.start();
        t2.start();
    }
}
// 1. 定义任务(不是线程,是任务)
class MyRunnable implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            // 打印当前线程名字,能看清谁在跑
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }
}
public class RunnableDemo {
    public static void main(String[] args) {
        // 1. 创建任务
        MyRunnable task = new MyRunnable();
        // 2. 创建 2 个线程,执行同一个任务!!!
        Thread t1 = new Thread(task, "线程1");
        Thread t2 = new Thread(task, "线程2");
        // 3. 启动两个线程 → 这就是多线程!
        t1.start();
        t2.start();
    }
}

线程生命周期

新建new线程对象-调用start(),等待CPU调度-CPU执行run方法-sleep,等待锁,IO阻塞-任务执行完毕/异常终止

sleep 线程休眠

让线程暂停指定毫秒,让出 CPU 执行权

class SleepThread implements Runnable{
    @Override
    public void run() {
        for (int i = 1; i <= 3; i++) {
            System.out.println("计数:"+i);
            try {
                // 休眠1000毫秒=1秒
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
public class SleepTest {
    public static void main(String[] args) {
        new Thread(new SleepThread()).start();
    }
}

线程安全问题 & synchronized 同步锁

多线程同时操作共享数据,会出现数据错乱,加锁保证同一时间仅一个线程访问

//无锁不安全示例
class Ticket implements Runnable{
    private int ticket = 10;
    @Override
    public void run() {
        while (ticket > 0){
            System.out.println("剩余票数:"+ticket--);
        }
    }
}
// 多线程抢票,会出现重复票数、负数票
public class UnSafeTest {
    public static void main(String[] args) {
        Ticket ticket = new Ticket();
        new Thread(ticket,"窗口1").start();
        new Thread(ticket,"窗口2").start();
    }
}
//synchronized 加锁解决安全问题
class SafeTicket implements Runnable{
    private int ticket = 10;
    // 锁对象
    private final Object lock = new Object();
    @Override
    public void run() {
        while (true){
            // 同步代码块,同一时间只允许一个线程进入
            synchronized (lock){
                if(ticket <= 0){
                    break;
                }
                System.out.println(Thread.currentThread().getName()+"出票,剩余:"+ticket--);
            }
        }
    }
}
public class SafeLockTest {
    public static void main(String[] args) {
        SafeTicket ticket = new SafeTicket();
        new Thread(ticket,"窗口A").start();
        new Thread(ticket,"窗口B").start();
    }
}

HashMap vs 线程安全集合

  • HashMap:线程不安全,多线程下会出错、数据丢失、死循环。
  • 线程安全集合:多线程下不会出错,保证数据正确。

HashMap 为什么线程不安全?

原因:

  • 没有加锁
  • 多线程同时修改、插入数据时,会互相覆盖、冲突
  • JDK 1.8 之前会造成死循环

多线程使用 HashMap 会出现什么问题?

  • 数据覆盖
  • 数据丢失
  • 并发修改异常
  • 极端情况下链表成环(卡死)

Java 提供哪些线程安全的 Map?

  • Hashtable(古老,效率低)
  • Collections.synchronizedMap(Map)(包装成安全 map)
  • ConcurrentHashMap推荐!最常用!高性能!

1)HashMap(线程不安全)

单线程用,多线程绝对不能用!

Map<String, String> map = new HashMap<>();

2)Hashtable(线程安全,但性能差)

  • 方法全部加 synchronized
  • 多线程会串行等待,性能差
  • 现在基本不用
Map<String, String> map = new Hashtable<>();

3)Collections.synchronizedMap(安全,性能一般)

把不安全的 Map 包装成安全的

Map<String, String> map = Collections.synchronizedMap(new HashMap<>());

4)ConcurrentHashMap(企业级首选!

  • Java 最推荐的线程安全 Map
  • 分段锁 / CAS 机制,高并发、高性能
  • 多线程开发必须用它
Map<String, String> map = new ConcurrentHashMap<>();

到此这篇关于Java多线程基础的文章就介绍到这了,更多相关java多线程基础内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈Java设置PPT幻灯片背景——纯色、渐变、图片背景

    浅谈Java设置PPT幻灯片背景——纯色、渐变、图片背景

    这篇文章主要介绍了Java设置PPT幻灯片背景——纯色、渐变、图片背景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Java线程代码的实现方法

    Java线程代码的实现方法

    下面小编就为大家带来一篇Java线程代码的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • java实现解析json复杂数据的第三种思路详解

    java实现解析json复杂数据的第三种思路详解

    这篇文章主要为大家信息介绍了java实现解析json复杂数据的第三种思路,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • Spring Boot 整合 SSE(Server-Sent Events)实战案例(全网最全)

    Spring Boot 整合 SSE(Server-Sent Events)实战案例(全网最全)

    本文通过实战案例讲解SpringBoot整合SSE技术,涵盖实现原理、代码配置、异常处理及前端交互,讨论与WebSocket对比、分布式解决方案、性能监控,感兴趣的朋友跟随小编一起看看吧
    2025-08-08
  • idea项目打开后出现橙色的时钟图标的解决

    idea项目打开后出现橙色的时钟图标的解决

    本文主要介绍了idea项目打开后出现橙色的时钟图标的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 解决 IDEA Maven 项目中"Could not find artifact" 问题的常见情况和解决方案

    解决 IDEA Maven 项目中"Could not find artifact" 

    这篇文章主要介绍了解决IDEA Maven项目中Could not find artifact问题的常见情况和解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • Java内部类和异常类的概念以及使用

    Java内部类和异常类的概念以及使用

    这篇文章主要介绍了Java内部类和异常类的概念以及使用,文中有非常详细的代码以及注释,适合正在学习java基础的同学们使用,需要的朋友可以参考下
    2021-04-04
  • Java实现数据连接池Druid举例

    Java实现数据连接池Druid举例

    本文主要介绍了Java实现数据连接池Druid举例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Java函数式编程(七):MapReduce

    Java函数式编程(七):MapReduce

    这篇文章主要介绍了Java函数式编程(七):MapReduce,本文是系列文章的第7篇,其它文章请参阅本文底部的相关文章,需要的朋友可以参考下
    2014-09-09
  • spring cloud 之 Feign 使用HTTP请求远程服务的实现方法

    spring cloud 之 Feign 使用HTTP请求远程服务的实现方法

    下面小编就为大家带来一篇spring cloud 之 Feign 使用HTTP请求远程服务的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06

最新评论