Java多线程——基础概念

Java多线程——基础概念

什么是进程和线程

在操作系统中,一个正在运行的程序称为进程(process),进程可以拥有多个相互独立执行流程,称为线程(thread)。一个进程中至少有一个主线程。

为什么需要使用多线程

多线程的主要目的是提高程序的效率,特别是在当程序需要同时执行多个耗时操作时,可以通过多线程将这些操作并发地执行,提高整个程序的执行效率。同时,多线程也能够使得程序具有更好的响应性,因为当一个线程被阻塞时,其他线程还可以继续执行,从而保持程序的运行。

如何实现多线程

Java中实现多线程主要有两种方式:继承Thread类和实现Runnable接口。

继承Thread类

继承Thread类是实现多线程的一种方式,具体步骤如下:

  1. 创建Thread子类,并重写run()方法
  2. 创建Thread子类的实例,并调用start()方法启动线程

示例代码如下:

public class MyThread extends Thread {
    public void run() {
        System.out.println("This is a new thread, started by extending Thread class.");
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();
        System.out.println("Main thread has finished.");
    }
}

运行结果:

This is a new thread, started by extending Thread class.
Main thread has finished.

实现Runnable接口

实现Runnable接口也是实现多线程的一种方式,具体步骤如下:

  1. 创建实现Runnable接口的类,该类包含一个run()方法
  2. 创建该类的实例
  3. 创建Thread类的实例,并将刚创建的Runnable实例作为参数传递给Thread的构造方法
  4. 调用start()方法启动线程

示例代码如下:

public class MyRunnable implements Runnable {
    public void run() {
        System.out.println("This is a new thread, started by implementing Runnable interface.");
    }
}

public class Main {
    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.start();
        System.out.println("Main thread has finished.");
    }
}

运行结果:

This is a new thread, started by implementing Runnable interface.
Main thread has finished.

线程的生命周期

在Java中,每个线程都有自己的生命周期。生命周期包括五个状态:

  1. 新建状态(New):线程被创建但还没有启动
  2. 就绪状态(Runnable):线程可以开始执行,等待被调度器调度
  3. 运行状态(Running):线程正在执行任务
  4. 阻塞状态(Blocked):线程被阻塞,等待某些条件的解除,例如等待IO完成、等待锁或等待线程的状态修改等
  5. 终止状态(Terminated):线程执行完任务或出现异常而终止

同步与互斥

多线程中经常会出现对共享资源的竞争,因此需要使用同步和互斥机制来保证对共享资源的正确访问。

Synchronized同步

Synchronized是Java中用来实现同步的关键字,加上Synchronized关键字的代码块,在同一时间只有一个线程可以执行,其他线程需要等待。

示例代码:

public class MyThread extends Thread {
    private static int count = 0;
    public synchronized void run() {
        for (int i = 0; i < 5; i++) {
            count++;
            System.out.println("Thread " + getName() + " gets count = " + count);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();
        thread1.start();
        thread2.start();
    }
}

运行结果:

Thread Thread-0 gets count = 1
Thread Thread-0 gets count = 2
Thread Thread-0 gets count = 3
Thread Thread-0 gets count = 4
Thread Thread-0 gets count = 5
Thread Thread-1 gets count = 6
Thread Thread-1 gets count = 7
Thread Thread-1 gets count = 8
Thread Thread-1 gets count = 9
Thread Thread-1 gets count = 10

Lock互斥

Java中也可以使用Lock接口来实现互斥,Lock接口提供了与Synchronized关键字相同的功能,但它提供了更高级的同步功能。使用Lock需要自己手动加锁和解锁。

示例代码:

public class MyThread extends Thread {
    private static int count = 0;
    private Lock lock = new ReentrantLock();
    public void run() {
        lock.lock();
        try {
            for (int i = 0; i < 5; i++) {
                count++;
                System.out.println("Thread " + getName() + " gets count = " + count);
            }
        } finally {
            lock.unlock();
        }
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();
        thread1.start();
        thread2.start();
    }
}

运行结果:

Thread Thread-0 gets count = 1
Thread Thread-0 gets count = 2
Thread Thread-0 gets count = 3
Thread Thread-0 gets count = 4
Thread Thread-0 gets count = 5
Thread Thread-1 gets count = 6
Thread Thread-1 gets count = 7
Thread Thread-1 gets count = 8
Thread Thread-1 gets count = 9
Thread Thread-1 gets count = 10

总结

Java多线程是Java编程领域中比较重要的一块内容,通过本文的讲解,希望读者能够掌握Java多线程的基本概念和实现方式。在实现多线程时要注意同步和互斥,保证程序的正确性和效率。

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

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

相关文章

  • JAVA中 Spring定时器的两种实现方式

    JAVA中Spring定时器可以使用两种方式实现,分别是基于注解的方式和基于XML配置的方式。下面分别进行说明。 基于注解的方式 1. 引入相关依赖 在pom.xml中引入Spring的定时器依赖: <dependency> <groupId>org.springframework</groupId> <artifa…

    Java 2023年6月1日
    00
  • Java实现快速排序算法(Quicktsort)

    Java实现快速排序算法(Quicksort) 在本文中,将介绍如何使用Java语言实现快速排序算法。快速排序算法是一种经典的排序算法,其时间复杂度为O(nlogn),其实现方式类似于分治算法,通过选择基准值,将输入序列分为两个子序列,分别对其进行递归排序。 算法原理 快速排序算法被认为是最优秀的排序算法之一,因为它的时间复杂度为O(nlogn),它的核心思…

    Java 2023年5月19日
    00
  • Java语言实现基数排序代码分享

    Java语言实现基数排序代码分享 什么是基数排序 基数排序(Radix Sort)是一种线性的时间复杂度的排序算法,它的速度比冒泡排序、插入排序、选择排序等算法都快,但是没有快速排序和归并排序快。基数排序是根据排序元素的每一个数位来排序元素的算法,时间复杂度为O(dn),其中d为元素位数。 基数排序的思路 基数排序依次对文本的排序关键字的每一位进行排序,从高…

    Java 2023年5月19日
    00
  • SpringMVC拦截器配置及运行流程解析

    SpringMVC拦截器配置及运行流程解析 前言 在 SpringMVC 中,拦截器是非常重要的一个组件之一,它可以拦截来自浏览器的请求并进行相应的处理,如登录认证、日志记录、性能监控等。本文将详细阐述 SpringMVC 拦截器的配置及运行流程,并提供两条示例说明,帮助读者更好地理解和应用拦截器。 拦截器的配置 在 SpringMVC 中,拦截器的配置是通…

    Java 2023年5月16日
    00
  • spring jpa 审计功能自定义填充字段方式

    首先,我们需要了解什么是 Spring Data JPA 审计功能。Spring Data JPA 审计功能是从 Spring Data JPA 1.5 版本开始引入的一个功能,它提供了一种简单方便的方式来自动填充实体类中的创建时间、修改时间、创建人、修改人等审计信息。在默认情况下,Spring Data JPA 审计功能会自动填充这些审计信息字段,但是有时…

    Java 2023年5月20日
    00
  • IDEA创建Maven工程Servlet的详细教程

    我将为你提供详细的”IDEA创建Maven工程Servlet的详细教程”攻略。 目录 背景知识 创建Maven工程 导入Servlet依赖 创建Servlet类 部署项目 示例代码 总结 1. 背景知识 在开始创造Maven工程和Servlet之前,需要知道什么是Maven和Servlet,以及IDEA是如何工作的。 1.1 Maven Maven是一个开源…

    Java 2023年5月19日
    00
  • Spring Boot 项目代码混淆,实战来了,再也不用担心代码泄露了!

    编译 简单就是把代码跑一哈,然后我们的代码 .java文件 就被编译成了 .class 文件 反编译 就是针对编译生成的 jar/war 包 里面的 .class 文件 逆向还原回来,可以看到你的代码写的啥。 比较常用的反编译工具 JD-GUI ,直接把编译好的jar丢进去,大部分都能反编译看到源码: 那如果不想给别人反编译看自己写的代码呢? 怎么做? 混淆…

    Java 2023年4月27日
    00
  • Spring Boot整合Spring Data JPA过程解析

    下面我会详细讲解“Spring Boot整合Spring Data JPA”的攻略,包括搭建环境、配置文件、实体类、DAO接口、Service接口和Controller等内容。并附加两个示例供您参考。 环境搭建 首先,你需要在Maven项目中添加以下依赖: <dependencies> <!–Spring Boot Web Starter…

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