一文带你学习Java中的线程

yizhihongxing

一文带你学习Java中的线程

什么是线程

线程是操作系统能够进行运算调度的最小单位。也就是说,线程是进程中的一个实体,是被系统独立调度和分配CPU时间的基本单位,是比进程更小的能独立运行的基本单位。

在Java中,线程是一个单独的执行路径,每个线程都有自己的栈和程序计数器。JVM运行线程调度,每个线程的执行顺序和时间是由操作系统决定。

如何创建线程

在Java中,有三种方法可以创建线程。

  1. 继承Thread类并覆盖run()方法。
    java
    public class MyThread extends Thread {
    @Override
    public void run() {
    // 线程执行的代码
    }
    }
  2. 实现Runnable接口并实现run()方法。
    java
    public class MyRunnable implements Runnable {
    @Override
    public void run() {
    // 线程执行的代码
    }
    }
  3. 使用匿名内部类创建线程。
    java
    Thread myThread = new Thread(new Runnable() {
    @Override
    public void run() {
    // 线程执行的代码
    }
    });

如何启动线程

在创建好线程后,需要使用start()方法来启动线程。start()方法会让线程进入可运行状态,等待JVM的调度。

Thread myThread = new MyThread();
myThread.start();

线程的状态

在Java中,线程可以有以下几种状态:

  • NEW:刚创建新线程,还未执行start()方法。
  • RUNNABLE:线程正在运行或等待CPU时间片,可以进入运行状态。
  • BLOCKED:线程阻塞于锁定的资源,等待释放锁。
  • WAITING:线程等待其他线程做出特定动作(无超时限制)。
  • TIMED_WAITING:线程等待其他线程做出特定动作(有超时限制)。
  • TERMINATED:线程已完成执行。

线程的生命周期

线程的生命周期包括以下几个阶段:

  1. NEW:新建状态。
  2. RUNNABLE:就绪状态。
  3. RUNNING:运行状态。
  4. BLOCKED:阻塞状态。
  5. TERMINATED:结束状态。

线程的同步

在多线程的情况下,同步是非常重要的。在Java中,可以使用synchronized关键字和lock机制实现线程的同步。

  1. 使用synchronized关键字

synchronized关键字可以用来保证多个线程之间的同步,它可以用来修饰方法和代码块。

java
public synchronized void method() {
// 线程同步代码
}

  1. 使用Lock机制

Lock机制是从JDK5开始引入的,它提供了比synchronized更强大的线程同步机制。使用Lock机制,需要先获取锁再执行线程同步代码。

java
Lock lock = new ReentrantLock();
lock.lock();
try {
// 线程同步代码
} finally {
lock.unlock();
}

线程的常用方法

在Java中,线程有一些常用的方法。

  1. sleep():使当前线程休眠指定的时间。
    java
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
  2. yield():让出CPU使用权,但不阻塞线程。
    java
    Thread.yield();
  3. join():等待其他线程执行完毕。
    java
    try {
    myThread.join();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }

示例1:使用线程打印1-10数字

public class PrintThread extends Thread {
    private int start;
    private int end;
    public PrintThread(int start, int end) {
        this.start = start;
        this.end = end;
    }
    @Override
    public void run() {
        for (int i = start; i <= end; i++) {
            System.out.println(i);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        PrintThread thread1 = new PrintThread(1, 5);
        PrintThread thread2 = new PrintThread(6, 10);
        thread1.start();
        thread2.start();
    }
}

示例2:使用线程计算1-100的总和

public class SumThread extends Thread {
    private int start;
    private int end;
    private int sum;
    public SumThread(int start, int end) {
        this.start = start;
        this.end = end;
        this.sum = 0;
    }
    @Override
    public void run() {
        for (int i = start; i <= end; i++) {
            sum += i;
        }
    }
    public int getSum() {
        return sum;
    }
}

public class Main {
    public static void main(String[] args) throws InterruptedException {
        SumThread thread1 = new SumThread(1, 50);
        SumThread thread2 = new SumThread(51, 100);
        thread1.start();
        thread2.start();
        thread1.join();
        thread2.join();
        int total = thread1.getSum() + thread2.getSum();
        System.out.println("1-100的总和为:" + total);
    }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文带你学习Java中的线程 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • SpringBoot超详细讲解自动配置原理

    SpringBoot超详细讲解自动配置原理 SpringBoot的自动配置是其最重要的特性之一。在本文中,我们将深入探讨SpringBoot自动配置的原理,并提供两个示例来帮助读者更好地理解这些概念。 自动配置原理 SpringBoot的自动配置是通过条件注解来实现的。条件注解是一种特殊的注解,它只有在满足特定条件时才会生效。SpringBoot使用条件注解…

    Java 2023年5月15日
    00
  • Spring Security内置过滤器的维护方法

    Spring Security 是一款基于 Servlet Filter 的安全框架,它提供了许多内置的过滤器来实现各种不同的安全策略。本文将详细讲解 Spring Security 内置过滤器的维护方法,以帮助开发者更好地使用 Spring Security。 什么是 Spring Security 内置过滤器? Spring Security 内置了许多…

    Java 2023年5月20日
    00
  • java SpringBoot 分布式事务的解决方案(JTA+Atomic+多数据源)

    下面我将详细讲解“Java SpringBoot 分布式事务的解决方案(JTA+Atomic+多数据源)”的完整攻略。 一、前置知识 在学习Java SpringBoot 分布式事务的解决方案之前,需要掌握以下相关知识: SpringBoot框架开发基础; 数据库事务基础; Java SE 8以及以上版本基础知识。 二、JTA+Atomikos+多数据源实现…

    Java 2023年5月19日
    00
  • java高级用法之JNA中的Function

    Java高级用法之JNA中的Function JNA是一种Java的native code 远程调用框架,通过JNA我们可以轻松调用系统DLL或者动态库,在Java中轻松访问系统底层资源。 Function是JNA的一个重要类,它可以封装C/C++中的函数,并在Java中直接调用。本攻略将详细介绍JNA中的Function,并给出两个示例说明。 1、Func…

    Java 2023年5月26日
    00
  • 深入解析Java中ThreadLocal线程类的作用和用法

    深入解析 Java 中 ThreadLocal 线程类的作用和用法 什么是 ThreadLocal Java 中的 ThreadLocal 是一个线程级别的变量,它是一个简单的线程安全机制,可以用于解决多线程中的并发问题。通俗地说,ThreadLocal 就是一个存放数据的盒子,每个线程有一个专属的盒子,不同线程之间互不干扰。 ThreadLocal 的使用…

    Java 2023年5月20日
    00
  • Kafka 安装与配置详细过程

    下面是 Kafka 安装与配置的详细攻略: 安装 Kafka 下载 Kafka 压缩包: wget http://mirrors.ocf.berkeley.edu/apache/kafka/2.8.0/kafka_2.13-2.8.0.tgz 解压缩 Kafka 压缩包: tar -xzf kafka_2.13-2.8.0.tgz 进入解压后的 Kafka …

    Java 2023年5月20日
    00
  • Java实现FTP上传与下载功能

    下面是Java实现FTP上传与下载功能的完整攻略: 1. 准备环境 在进行FTP上传与下载之前,需要准备以下环境: Java运行环境 FTP服务器 FTP登录账号和密码 2. 引入FTP客户端库 Java提供了FTP客户端库供我们使用,常见的有Apache commons-net和Spring FTP等,这里我们以Apache commons-net为例。在…

    Java 2023年5月20日
    00
  • Java编程接口调用的作用及代码分享

    下面我将详细讲解“Java编程接口调用的作用及代码分享”的完整攻略。 Java编程接口调用的作用 Java编程接口(API)是Java标准库中的一组类和接口,用于提供基本的程序操作功能。Java API包含了很多常用的类,比如String、Math和ArrayList等,可以帮助程序员快速进行开发。 Java编程接口调用的作用是在程序中调用Java API提…

    Java 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部