Java多线程——基础概念

yizhihongxing

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解析出url请求的路径和参数键值对类(解析出url请求的路径,包括页面)

    下面是详细的攻略: 1. 确定需求和目标 在写代码之前,我们需要明确自己的目标和需求,即需要完成什么样的功能。根据题目的要求,我们需要编写一个Java类,该类可以解析出传入的URL请求的路径和参数键值对。 2. 解析路径和参数 在Java中,我们可以使用Java内置的类库中的java.net.URL和java.net.URLConnection类来获取URL…

    Java 2023年6月15日
    00
  • java — 标记接口

    标记接口 标记接口(Marker Interface),又称标签接口(Tag Interface) 仅代表一个标记 不包含任何方法标记接口是用来判断某个类是否具有某种能力 Cloneable标记接口 此类实现了 Cloneable 接口,以指示 Object.clone 方法可以合法地对该类实例进行按字段复制如果在没有实现 Cloneable 接口的实例上调…

    Java 2023年4月17日
    00
  • Java编程实现springMVC简单登录实例

    下面我来详细讲解Java编程实现springMVC简单登录实例的攻略,包括如何搭建环境、代码实现过程和相关注意事项。 环境搭建 在实现SpringMVC登录功能之前,我们需要完成相关的环境搭建。以下是必要的环境要求: JDK 8或以上版本 Eclipse IDE for Enterprise Java Developers(或其他Java开发环境) Mave…

    Java 2023年5月16日
    00
  • JSP中的PreparedStatement对象操作数据库的使用教程

    下面我将详细讲解有关“JSP中的PreparedStatement对象操作数据库的使用教程”的完整攻略。 概述 在JSP中,可以使用PreparedStatement对象来完成对数据库的增删改查操作。PreparedStatement是一种预编译的SQL语句对象,可以提高查询效率,防止SQL注入攻击。在使用PreparedStatement操作数据库时,需要…

    Java 2023年6月15日
    00
  • Java Servlet输出中文乱码问题解决方案

    针对“Java Servlet输出中文乱码问题解决方案”,我来给你一个完整的攻略。具体步骤如下: 1. 设置请求和响应的编码方式 在Servlet中,我们需要设置请求和响应的编码方式为utf-8,即: request.setCharacterEncoding("utf-8"); // 设置请求编码方式为utf-8 response.set…

    Java 2023年5月20日
    00
  • 浅谈在Java中JSON的多种使用方式

    浅谈在Java中JSON的多种使用方式 什么是JSON JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,其来源于JavaScript. 通常用于将结构化数据序列化为文本格式,可以轻松地在不同的系统中传递、存储和分析数据. JSON将数据表达为键值对的集合,具有易于阅读和编写的文本格式,易于机器解析和生成,并且良好…

    Java 2023年5月26日
    00
  • springBoot系列常用注解(小结)

    那我会从以下几个方面为您详细讲解springBoot系列常用注解: Spring Boot注解概述 Spring Boot常用注解 Spring Boot常见注解示例解析 1. Spring Boot注解概述 Spring Boot是Spring开发团队为简化Spring开发而设计的一个轻量级框架。在使用Spring Boot中,注解是至关重要,它们可以用来…

    Java 2023年5月15日
    00
  • 微信小程序实现电子签名

    当涉及到微信小程序实现电子签名时,你需要考虑的几个方面包括: 1.实现方式:使用canvas绘制签名区域并导出图片保存。2.显示签名:使用Image组件或canvas绘制签名。3.文档验证:签名本身并不具有验证功能,需要合适的过程和算法确保签名的安全性。 接下来,我将详细讲解实现电子签名的完整攻略。 步骤1:创建签名区域 要在小程序中实现签名,你需要在页面上…

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