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日

相关文章

  • ServletContext中常用方法介绍

    下面是关于“ServletContext中常用方法介绍”的完整攻略。 一、ServletContext概述 在Java Web中,ServletContext表示Servlet上下文,是一个Web应用的全局上下文环境。每个Web应用都会有一个ServletContext,在应用启动的时候创建,并且在应用停止的时候销毁。 ServletContext中的信息可…

    Java 2023年6月2日
    00
  • Java中的数组基础知识学习教程

    Java中的数组基础知识学习教程 什么是数组 数组是一种可以存储多个同类型元素的容器。在Java中,数组分为一维数组和多维数组。一维数组可以看作是含有一行元素的表格,多维数组则可以看作是含有多行多列的表格。 如何声明数组 Java中声明数组需要指定数组类型、数组名和数组长度。声明语法如下: 数组类型[] 数组名 = new 数组类型[数组长度]; 比如声明一…

    Java 2023年5月26日
    00
  • 站长必看!赚钱网站资源贴

    站长必看!赚钱网站资源贴 一、引言 作为一个网站站长,赚钱是我们始终追求的一个目标。然而,在众多的网络赚钱方法中选择适合自己的方式并不是一件容易的事情。因此,本文针对网站站长提供了一些有用的资源和建议,帮助您更加容易地赚钱。 二、网站广告 网站广告是一种常见的赚钱方式,下面列出几种常见的广告形式: 1. 横幅广告 横幅广告是在页面的顶部或底部显示的广告条,通…

    Java 2023年6月16日
    00
  • SpringBoot如何使用自定义注解实现接口限流

    接下来我将详细讲解SpringBoot如何使用自定义注解实现接口限流。 一、什么是接口限流?为什么需要接口限流? 接口限流是应对高并发场景下保障系统稳定性的一种重要手段。一些接口请求过于频繁,可能会占用系统过多的资源,导致系统崩溃等问题。因此,我们需要对这些接口设置限流策略,对请求进行控制,而这种限流策略就是接口限流。 二、如何使用自定义注解实现接口限流? …

    Java 2023年5月26日
    00
  • 教你如何在 javadoc 输出<> 符号

    当我们在撰写Java API文档时,有些类和方法的描述中可能涉及到尖括号(<和>)等特殊符号,但是当这些符号在javadoc中直接显示时会被解析为html标签,导致javadoc的显示不正常,影响使用。那么,如何在javadoc中输出这些特殊符号呢?下面是详细攻略: 1. 使用html实体字符 可以使用html实体字符来替代尖括号,其中大于号可用…

    Java 2023年5月26日
    00
  • 通过IEAD+Maven快速搭建SSM项目的过程(Spring + Spring MVC + Mybatis)

    通过IEAD+Maven快速搭建SSM项目的过程,可以分为以下几步: 在IEAD中创建Maven项目,并配置pom.xml文件 添加Spring、Spring MVC、Mybatis等框架的依赖 配置web.xml文件,进行Servlet、DispatcherServlet的配置 创建数据库表,编写实体类和Mapper接口 编写Service层和Contro…

    Java 2023年5月19日
    00
  • JDBC的扩展知识点总结

    下面我会详细讲解“JDBC的扩展知识点总结”的完整攻略。 JDBC的扩展知识点总结 什么是JDBC Java数据库连接(Java Database Connectivity,简称JDBC)是Java语言中用于执行SQL语句的一组API。通俗地讲,JDBC就是Java语言连接数据库的一个标准规范。使用JDBC,可以使Java程序与任何支持SQL的关系型数据库进…

    Java 2023年5月20日
    00
  • js实现定时进度条完成后切换图片

    下面是实现”js实现定时进度条完成后切换图片”的完整攻略。 目录 1.需求分析 2.方案设计 3.实现步骤 4.示例说明 4.1 示例1:进度条倒计时 4.2 示例2:图片切换 1.需求分析 我们需要实现一个功能,当用户进入页面时,能够显示一个进度条,并在进度条走完后自动切换到下一张图片。 2.方案设计 根据需求,我们需要实现以下几个功能: 显示进度条 进度…

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