一文带你学习Java中的线程

一文带你学习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项目中利用maven的generate插件

    以下是利用maven的generate插件在SpringBoot项目中的完整攻略,包含两个示例。 什么是maven的generate插件 maven的generate插件是一个代码生成插件,可以根据指定的模板文件和数据生成指定的代码文件。在SpringBoot项目中,我们可以利用generate插件来生成一些常用的代码,例如controller、servic…

    Java 2023年5月19日
    00
  • 什么是虚拟机?

    以下是关于虚拟机的完整使用攻略: 什么是虚拟机? 虚拟机是一种软件,它模拟了一台计算机的硬件和操作系统,使得用户可以在一台计算机上运行多个操作系统和应用程序。虚拟机可以在不同的操作系统之间提供互操作性,同时也可以提供更好的资源利用率和更好的安全性。 如何使用虚拟机? 使用虚拟机需要以下步骤: 下载并安装虚拟机软件,如VirtualBox、VMware等。 下…

    Java 2023年5月12日
    00
  • 详解Spring MVC拦截器实现session控制

    详解 Spring MVC 拦截器实现 Session 控制 在 Web 应用程序中,Session 控制是非常重要的一部分。Spring MVC 拦截器可以用来实现 Session 控制,本文将详细讲解 Spring MVC 拦截器实现 Session 控制的方法,并提供两个示例说明。 1. 创建拦截器 要实现 Session 控制,我们需要创建一个拦截器…

    Java 2023年5月18日
    00
  • Java和C++通过new创建的对象有何区别?

    Java和C++都支持通过关键字 “new” 创建对象,但是它们创建的对象在内存中的存储方式以及允许进行的操作不同。具体细节请参考以下内容: Java中new创建对象的特点 在Java中,当使用new关键字创建一个对象时,会进行以下操作: 在堆内存中为该对象分配连续的内存空间。 返回一个指向该对象的引用,这个引用就是Java对象的句柄。 Java中创建的对象…

    Java 2023年5月26日
    00
  • java项目构建Gradle的使用教程

    下面是关于“java项目构建Gradle的使用教程”的完整攻略。 简介 Gradle是一种基于Apache Maven和Apache Ant的构建工具,将两者优点结合在一起,使用Groovy DSL(领域特定语言)进行构建,支持多种编程语言。Gradle是一个灵活、高效、多功能的构建工具,是Java应用程序的首选构建工具之一。 Gradle的安装 Gradl…

    Java 2023年5月19日
    00
  • Java原生操作JDBC连接以及原理详解

    Java原生操作JDBC连接以及原理详解 JDBC(Java Database Connectivity,java数据连接)是java语言访问数据库的标准规范,使用JDBC可以方便地连接数据库、执行SQL语句、获取结果等。本文将介绍如何在Java中原生操作JDBC连接,并对JDBC连接的一些原理进行详细解释。 JDBC的工作原理 JDBC的工作原理主要是:使…

    Java 2023年5月19日
    00
  • Spring Boot超详细讲解请求处理流程机制

    Spring Boot超详细讲解请求处理流程机制 Spring Boot是一个非常流行的Java Web框架,它提供了许多方便的功能,如自动配置、快速开发和易于部署。在开发过程中,我们需要了解Spring Boot的请求处理流程机制,以便更好地理解应用程序的工作原理。本文将详细介绍Spring Boot的请求处理流程机制,并提供两个示例。 请求处理流程机制 …

    Java 2023年5月15日
    00
  • Java实现打字游戏

    Java实现打字游戏攻略 概述 在这篇攻略中,我们将学习如何使用Java语言实现一个基本的打字游戏。在游戏开始时,程序会随机选择一个字符串(可以是一个单词或一个句子),然后玩家必须输入这个字符串。如果他们输入正确,游戏将结束,否则他们将需要重新输入。我们将利用Java的输入/输出流和字符串处理来完成这个任务。 实现步骤 步骤一:生成随机字符串 首先,我们需要…

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