Java并发编程——线程基础

Java并发编程的核心之一就是线程(Thread)。线程是程序执行流的最小单元,Java通过线程来实现并发编程。以下是Java线程的一些基础概念:

1. 线程的创建

在Java中,创建线程主要有两种方式:

  1. 继承Thread类

通过继承Thread类并重写其run()方法,可以创建一个线程。然后调用该线程的start()方法启动线程,这会自动调用run()方法。

java 复制代码
public class MyThread extends Thread {
    @Override
    public void run() {
        // 线程执行的代码
        System.out.println("MyThread is running");
    }

    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start(); // 启动线程
    }
}
  1. 实现Runnable接口

通过实现Runnable接口并重写其run()方法,可以创建一个线程任务。然后可以将这个任务作为参数传递给Thread类的构造函数来创建线程,并调用start()方法启动线程。

java 复制代码
public class MyRunnable implements Runnable {
    @Override
    public void run() {
        // 线程执行的代码
        System.out.println("MyRunnable is running");
    }

    public static void main(String[] args) {
        Thread thread = new Thread(new MyRunnable());
        thread.start(); // 启动线程
    }
}

2. 线程的状态

Java线程具有五种状态:

  • 新建(New):新创建了一个线程对象。
  • 就绪(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。
  • 运行(Running):就绪状态的线程获取了CPU,执行程序代码。
  • 阻塞(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。
  • 死亡(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

3. 线程的控制

Java提供了一些方法来控制线程的执行:

  • start():启动线程,执行run()方法。
  • run():线程在被调度时执行的任务代码。
  • sleep(long millis):使当前线程(即调用该方法的线程)暂停执行一段时间(以毫秒为单位)。
  • interrupt():中断线程。中断的线程将会收到一个中断信号,线程可以选择响应中断(结束线程或做其他处理),也可以忽略中断。
  • join():等待其他线程终止。当前线程调用另一个线程的join()方法,则当前线程将被阻塞,直到另一个线程运行结束,当前线程才可继续执行。
  • isAlive():判断线程是否存活。
  • currentThread():返回对当前正在执行的线程对象的引用。

4. 线程的优先级

Java中的线程有优先级,优先级高的线程获得更多的执行机会。但线程的优先级并不能保证线程的执行顺序。线程的优先级用整数表示,范围从1(最低优先级)到10(最高优先级)。Java线程的默认优先级是5。

可以通过setPriority(int priority)方法设置线程的优先级,通过getPriority()方法获取线程的优先级。

5. 线程安全

多线程并发访问共享数据时可能会出现线程安全问题。Java提供了多种机制来保证线程安全,如synchronized关键字、volatile关键字、Lock接口等。

相关推荐
zfoo-framework2 分钟前
【jenkins插件】
java
风_流沙7 分钟前
java 对ElasticSearch数据库操作封装工具类(对你是否适用嘞)
java·数据库·elasticsearch
charlie11451419111 分钟前
C++ STL CookBook
开发语言·c++·stl·c++20
袁袁袁袁满11 分钟前
100天精通Python(爬虫篇)——第113天:‌爬虫基础模块之urllib详细教程大全
开发语言·爬虫·python·网络爬虫·爬虫实战·urllib·urllib模块教程
ELI_He99918 分钟前
PHP中替换某个包或某个类
开发语言·php
m0_7482361125 分钟前
Calcite Web 项目常见问题解决方案
开发语言·前端·rust
倔强的石头10633 分钟前
【C++指南】类和对象(九):内部类
开发语言·c++
ProtonBase37 分钟前
如何从 0 到 1 ,打造全新一代分布式数据架构
java·网络·数据库·数据仓库·分布式·云原生·架构
Watermelo61738 分钟前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
乐之者v43 分钟前
leetCode43.字符串相乘
java·数据结构·算法