Java多线程Thread基础学习

Java多线程Thread基础学习

1. 什么是Java多线程?

Java多线程是指在一个Java程序的执行过程中,有多个线程在同时执行。多线程的出现,可以提高程序的运行效率,提升用户体验。Java实现多线程的方法比较简单,主要依靠一个Thread类来实现。

2. Thread类的基本操作

在Java中,要实现多线程,我们可以创建一个Thread对象,然后重写run()方法,使其在start()方法被调用的时候执行。下面是一个简单的Thread的实现,用于输出数字1~10:

public class MyThread extends Thread {

    public void run() {
        for(int i=1; i<=10; i++) {
            System.out.print(i + " ");
        }
    }

}

public class Main {

    public static void main(String[] args) {
        MyThread t = new MyThread();
        t.start();
    }

}

上述代码中,MyThread继承了Thread类,并重写了run()方法。在main()方法中,我们创建了一个MyThread的实例,并通过start()方法启动线程。

3. Runnable接口的基本操作

除了继承Thread类外,还有一种实现多线程的方法:实现Runnable接口,将run()方法作为线程的执行体。这种方法更为常用,因为Java不支持多重继承,且实现Runnable接口可以更方便地共享线程类的实例。

public class MyRunnable implements Runnable {

    public void run() {
        for(int i=1; i<=10; i++) {
            System.out.print(i + " ");
        }
    }

}

public class Main {

    public static void main(String[] args) {
        MyRunnable r = new MyRunnable();
        Thread t = new Thread(r);
        t.start();
    }

}

上述代码中,我们定义了一个MyRunnable类,实现了Runnable接口,并在run()方法中输出数字1~10。在main()方法中,我们创建了一个MyRunnable的实例,并将其作为Thread类的构造函数参数传入,然后启动线程。

4. 线程的状态

线程在执行过程中,会处于不同的状态。Java提供了一些方法获取线程的状态。

  • 新建状态(New):当我们创建一个Thread对象时,线程处于新建状态,还未开始执行。此时可以使用Thread.getState()方法获取状态,返回值为NEW。

  • 就绪状态(Runnable):当线程调用start()方法时,线程进入就绪状态。此时可以使用Thread.getState()方法获取状态,返回值为RUNNABLE。

  • 运行状态(Running):当线程被调度为运行状态,即CPU正在执行该线程时,该线程处于运行状态。此时可以使用Thread.getState()方法获取状态,返回值为RUNNABLE。

  • 阻塞状态(Blocked):线程正在等待锁定的监视器,或正在等待IO资源等,此时线程进入阻塞状态。此时可以使用Thread.getState()方法获取状态,返回值为BLOCKED。

  • 等待状态(Waiting):线程正在等待另一个线程来执行特定操作,此时线程进入等待状态。此时可以使用Thread.getState()方法获取状态,返回值为WAITING。

  • 超时等待状态(Timed Waiting):和等待状态类似,不过超时等待状态有一个超时时间。此时可以使用Thread.getState()方法获取状态,返回值为TIMED_WAITING。

  • 结束状态(Terminated):线程执行完run()方法后,线程进入结束状态。此时可以使用Thread.getState()方法获取状态,返回值为TERMINATED。

5. 总结

以上,我们介绍了Java多线程Thread的基础知识,讲解了Thread类和Runnable接口的基本操作,以及线程的状态。Java中多线程的实现方法还有很多,比如使用线程池,使用Callable,使用Future等,这里不再赘述。

作为一个Java程序员,多线程是必须掌握的知识点,希望本文可以帮助大家更好地理解Java多线程的基础知识。

6. 附加示例

下面是一个示例,演示了两个线程间的通信:

class MySemaphore {

    private boolean signal = false;

    public synchronized void take() {
        this.signal = true;
        this.notify();
    }

    public synchronized void release() throws InterruptedException {
        while (!this.signal) {
            this.wait();
        }
        this.signal = false;
    }

}

class MyThread1 extends Thread {

    private MySemaphore semaphore;

    public MyThread1(MySemaphore semaphore) {
        this.semaphore = semaphore;
    }

    public void run() {
        try {
            System.out.println("Thread 1 - I'm doing some work");
            Thread.sleep(1000);
            this.semaphore.take();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

class MyThread2 extends Thread {

    private MySemaphore semaphore;

    public MyThread2(MySemaphore semaphore) {
        this.semaphore = semaphore;
    }

    public void run() {
        try {
            this.semaphore.release();
            System.out.println("Thread 2 - I'm doing some work");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

public class Main {

    public static void main(String[] args) {

        MySemaphore semaphore = new MySemaphore();
        MyThread1 thread1 = new MyThread1(semaphore);
        MyThread2 thread2 = new MyThread2(semaphore);

        thread1.start();

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

        System.out.println("All threads done!");

    }

}

在该示例中,我们创建了一个MySemaphore类,用于两个线程间的通信。线程1在执行完一段工作之后,调用MySemaphore的take()方法,线程2在执行完一段工作之前,调用MySemaphore的release()方法。通过MySemaphore通知机制,实现了线程间的同步。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java多线程Thread基础学习 - Python技术站

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

相关文章

  • SpringBoot多数据库连接(mysql+oracle)的实现

    下面就是“SpringBoot多数据库连接(mysql+oracle)的实现”的完整攻略。 一、依赖引入 首先在pom.xml中引入mysql和oracle的jdbc依赖,以及SpringBoot的相关依赖: <dependencies> <!– mysql jdbc –> <dependency> <group…

    Java 2023年5月20日
    00
  • Spring Data Jpa+SpringMVC+Jquery.pagination.js实现分页示例

    下面我来详细讲解一下“Spring Data Jpa+SpringMVC+Jquery.pagination.js实现分页示例”的完整攻略。 1. 环境准备 首先,我们需要准备好以下环境: JDK 1.8 Spring Boot 2.3.4.RELEASE Spring Data JPA 2.3.4.RELEASE MySQL 8.0.21 Maven 3.…

    Java 2023年5月20日
    00
  • 批处理杨辉三角效果实现代码

    以下是“批处理杨辉三角效果实现代码”的完整攻略,包含了代码实现和示例说明。 批处理杨辉三角效果实现 杨辉三角是一种数学图形,它由排列成三角形的数字构成,起始数字为1,下一行的数字是由上一行相邻数字相加而得出的。在批处理程序中,可以用一系列的数字来实现杨辉三角的效果。 实现代码 下面是一个实现批处理杨辉三角效果的代码示例: @echo off setlocal…

    Java 2023年5月23日
    00
  • 理解java多线程中ExecutorService使用

    接下来我会为你详细讲解 “理解Java多线程中ExecutorService使用”的完整攻略。 1. ExecutorService 是什么? ExecutorService 接口是 Java 并发 API 提供的一个线程池管理器。它可以管理一个池子中的线程数量,也可以通过合理配置线程池中的参数,来提高系统的吞吐量和性能。 2. ExecutorServic…

    Java 2023年5月26日
    00
  • JavaSE详细讲解异常语法

    针对“JavaSE详细讲解异常语法”的完整攻略,我会提供如下的详细讲解,其中包含异常的概念、异常的分类、异常处理的方式以及带有示例的具体说明。 异常的概念 Java 中的异常指的是程序在运行过程中发生的错误或者异常情况,例如除数为0、数组角标越界、空指针等。当程序出现异常时,Java 虚拟机会抛出一个异常对象,如果不对异常进行处理,则会导致程序的中断。在 J…

    Java 2023年5月26日
    00
  • Java对象数组定义与用法详解

    Java对象数组定义与用法详解 在Java中, 数组是一种非常重要的数据结构,对象数组则是一种非常常用的数据类型。 定义对象数组 定义对象数组需要明确三个部分: 元素类型、数组名、以及数组大小。 类型[] 数组名 = new 类型[数组大小]; 例如,有一个Student类,需要定义一个包含5个学生对象的数组, 可以使用以下方式进行定义: Student[]…

    Java 2023年5月26日
    00
  • Spring Boot 整合持久层之Spring Data JPA

    下面我将为你详细讲解“Spring Boot 整合持久层之Spring Data JPA”的完整攻略,并提供两个示例。 Spring Boot 整合持久层之Spring Data JPA 什么是Spring Data JPA? Spring Data JPA 是Spring框架提供的一种基于 JPA 规范的持久化框架,它通过简化持久层的开发,让开发人员更专注…

    Java 2023年5月19日
    00
  • centOS7安装jdk1.8的方法

    当我们需要在CentOS 7服务器上安装Java开发工具包(JDK)1.8时,我们可以按照以下步骤进行操作: 步骤一:检查并更新系统包管理器 在开始安装过程前,建议先通过以下命令检查系统中是否已安装其他版本的JDK: java -version 如果输出结果显示当前系统中没有安装任何版本的JDK,则允许继续操作;如果已安装其它版本的JDK,则需要卸载旧版本,…

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