初步学习Java中线程的实现与生命周期

yizhihongxing

初步学习Java中线程的实现与生命周期攻略

什么是线程?

  • 线程是程序执行的一个单元,也是进程内的一个独立控制流。

  • 一个进程中可以有多个线程,它们共享内存空间和一些进程级的数据,但每个线程有自己的计数器、栈空间及局部变量。

  • 线程的使用可以提高程序的效率。

常用的线程实现方式

Java中有两种创建线程的方式:继承Thread类和实现Runnable接口。

继承Thread类

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

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

实现Runnable接口

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

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

线程生命周期

线程的生命周期包括5个状态:新建、就绪、运行、阻塞、死亡。

新建状态

当使用new关键字创建一个线程对象时,线程处于新建状态。

就绪状态

当线程对象被创建后,调用start()方法后,线程进入就绪状态,等待获取CPU调用run()方法开始执行。

public class MyThread extends Thread {

    public void run() {
        // 线程执行的代码
        System.out.println("Thread is running...");
    }

    public static void main(String[] args) {
        MyThread myThread1 = new MyThread();
        MyThread myThread2 = new MyThread();
        MyThread myThread3 = new MyThread();

        myThread1.start(); // 就绪状态
        myThread2.start(); // 就绪状态
        myThread3.start(); // 就绪状态
    }
}

运行状态

当线程获得CPU时间片以后,进入运行状态。

public class MyThread extends Thread {

    public void run() {
        for (int i = 1; i <= 5; i++) {
            System.out.println("Thread is running: " + i);
        }
    }

    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start(); // 就绪状态

        System.out.println("Main thread is running...");

        try {
            myThread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Main thread is over.");
    }
}

阻塞状态

当线程因为某些原因(如等待I/O操作、调用sleep()方法)不能继续执行时,进入阻塞状态。

public class MyThread extends Thread {

    public void run() {
        System.out.println("Thread is running...");
        try {
            Thread.sleep(5000); // 线程进入阻塞状态,等待5秒钟
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Thread is over.");
    }

    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start(); // 就绪状态
        System.out.println("Main thread is running...");
    }
}

死亡状态

线程执行完run()方法后,线程进入死亡状态。

public class MyThread extends Thread {

    public void run() {
        System.out.println("Thread is running...");
    }

    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start(); // 就绪状态

        try {
            myThread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Thread is over.");

    }
}

示例说明

示例一

public class MyThread extends Thread {

    @Override
    public void run() {
        for (int i = 1; i <= 5; i++) {
            System.out.println("Thread is running: " + i);
        }
    }

    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start(); // 就绪状态

        System.out.println("Main thread is running...");

        try {
            myThread.join(); // 等待子线程结束
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Main thread is over.");
    }
}

该示例中,我们继承了Thread类,重写了run()方法,实现了一个简单的多线程程序。在main()方法中,我们创建了一个MyThread对象,并且通过start()方法启动线程,进入就绪状态。

在主线程中,我们通过调用join()方法来等待子线程执行完成后再执行主线程。

示例二

public class MyRunnable implements Runnable {

    @Override
    public void run() {
        System.out.println("Thread is running...");
    }

    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.start(); // 就绪状态

        System.out.println("Main thread is running...");
    }
}

该示例中,我们实现了Runnable接口,重写了run()方法,创建了Thread对象,并且将MyRunnable对象作为参数传递给Thread的构造方法中。通过start()方法启动线程,进入就绪状态。

在主线程中,我们直接调用System.out.println()方法来输出信息。可以看到子线程是在主线程之后执行的,因为它处于不同的线程之中。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:初步学习Java中线程的实现与生命周期 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Flutter 如何封装文本输入框组件

    以下是Flutter如何封装文本输入框组件的完整攻略: 1. 了解需求 在开始封装文本输入框组件之前,我们需要了解我们的需求是什么。在这种情况下,我们需要一个可重复使用的文本输入框组件,它需要输入文本,并且可以设置提示文本、输入类型和文本样式等属性。 2. 创建文本输入框组件 我们可以使用StatefulWidget创建一个文本输入框组件。以下是一个示例: …

    other 2023年6月25日
    00
  • hive创建表

    Hive创建表 Hive是基于Hadoop的一种数据仓库解决方案,它提供了类SQL的接口,可以将结构化的数据映射为一张数据库表,并通过HiveQL查询语言进行数据的分析和查询。下面我们将介绍如何在Hive中创建表。 创建表语法 我们可以使用CREATE TABLE语句在Hive中创建表格,其语法如下: CREATE [EXTERNAL] TABLE [IF …

    其他 2023年3月28日
    00
  • 不用构造函数(Constructor)new关键字也能实现JavaScript的面向对象

    在JavaScript中,我们可以使用对象字面量的方式来创建对象,不需要使用构造函数(Constructor)和new关键字。这种方法被称为“字面量创建对象”或“对象字面量”。 步骤如下: 首先,我们需要定义一个对象字面量。对象字面量就是由一对花括号{}包裹的键值对。 然后,我们可以给对象字面量添加属性和方法,属性和方法用冒号:分隔,方法和方法之间用逗号,分…

    other 2023年6月26日
    00
  • oracle常用函数整理

    以下是Oracle常用函数整理的完整攻略,包括两个示例说明。 Oracle常用函数整理 Oracle是一种常用的关系型数据库管理系统,提供了许多内置函数,用于处理和操作数据。以下是一些常用的Oracle函数。 字符串函数 CONCAT函数 CONCAT函数用于将两个或多个字符串连接在一起。 示例: SELECT CONCAT(‘Hello’, ‘World’…

    other 2023年5月6日
    00
  • 开发人员所需要知道的HTML5性能分析面面观

    HTML5是一个非常强大的技术,可以创造出流畅且功能丰富的前端用户体验。在进行网站开发时,了解HTML5的性能分析是非常必要的。下面将详细讲解开发人员需要了解的HTML5性能分析及相关攻略。 了解网页性能分析工具 在进行性能分析时,首先需要了解网页性能分析工具,这些工具可以帮助开发人员深入了解网页的各种性能指标。常用的网页性能分析工具包括Google Pag…

    other 2023年6月28日
    00
  • 老生常谈php 正则中的i,m,s,x,e分别表示什么

    在PHP正则表达式中,i、m、s、x和e是修饰符,用于改变正则表达式的匹配行为。下面是每个修饰符的详细解释: i修饰符(不区分大小写):i修饰符用于使正则表达式在匹配时不区分大小写。例如,正则表达式/hello/i将匹配\”Hello\”、\”hello\”和\”HELLO\”等字符串。 示例1: <?php $pattern = ‘/hello/i’…

    other 2023年8月18日
    00
  • keil5最新破解教程

    为了保护正版软件的版权,我们不应该支持或鼓励破解软件。要获得 Keil 5 的最新版本,建议购买合法的许可证或加入 Keil 官方计划。如果您有任何合法的使用需求,请考虑咨询 Keil 官方支持团队。 此外,我们也不会提供任何非法破解软件或教程。我们应该尊重知识产权和法律法规。 无论如何,如果您遇到任何 Keil 相关的问题,我们乐意提供帮助和解答。请提出具…

    其他 2023年4月16日
    00
  • 使用NodePad++来编辑我们服务器的配置文件防止无法运行

    当我们在使用服务器的时候,由于环境、版本等各种原因,可能导致程序无法正常运行。针对这种情况,我们可以通过对服务器的配置文件进行修改来解决。本篇攻略将详细介绍如何使用 NodePad++ 来编辑服务器的配置文件,以保证程序的正常运行。 准备工作 在开始之前,我们需要准备以下两个工具: 服务器管理工具:我们可以使用著名的 PuTTY 工具进行远程连接,进而管理配…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部