【Java 基础篇】Java多线程编程详解-程序员宅基地

技术标签: jvm  java  Java 从入门到精通  开发语言  

导言

在Java开发中,多线程编程是一种并发编程的技术,允许程序同时执行多个线程,从而提高应用程序的性能和响应能力。本文将详细介绍Java多线程的概念、多线程编程的原理和常用的多线程编程技术,并提供一些示例代码。

一、多线程的概念

多线程是指在一个程序中同时执行多个线程的能力。线程是执行程序的最小单位,每个线程都有自己的执行路径和执行状态。在多线程编程中,可以将任务分为多个子任务,并在不同的线程中并发执行,从而提高程序的效率和性能。

多线程编程的核心概念包括线程创建、线程同步和线程通信。线程创建是指创建和启动线程;线程同步是指协调多个线程之间的执行顺序和访问共享资源的方式;线程通信是指多个线程之间的信息交换和协作。

二、多线程编程的原理

多线程编程基于操作系统提供的线程调度机制。在Java中,线程由JVM进行管理和调度。每个线程都有自己的执行栈和执行上下文,并按照一定的调度策略进行切换和执行。

Java提供了多线程编程的API和工具,使得开发人员可以方便地创建和管理线程。常用的多线程编程类包括Thread类和Runnable接口,以及线程同步和线程通信的工具类,如锁、条件变量、信号量等。

三、多线程编程的常用技术

1. 创建线程

在Java中,可以通过继承Thread类或实现Runnable接口来创建线程。继承Thread类需要重写run()方法,实现线程的执行逻辑。实现Runnable接口需要实现run()方法,并将Runnable对象传递给Thread类的构造函数。

下面是一个示例代码,演示了如何创建和启动线程:

public class ThreadCreationExample {
    
    public static void main(String[] args) {
    
        // 创建并启动线程
        Thread thread = new MyThread();
        thread.start();

        // 创建并启动线程
        Runnable runnable = new MyRunnable();
        Thread thread2 = new Thread(runnable);
        thread2.start();
    }
}

class MyThread extends Thread {
    
    @Override
    public void run() {
    
        // 线程执行逻辑
        System.out.println("Hello from MyThread!");
    }
}

class MyRunnable implements Runnable {
    
    @Override
    public void run() {
    
        // 线程执行逻辑
        System.out.println("Hello from MyRunnable!");
    }
}

2. 线程同步

在线程编程中,线程同步是一种机制,用于协调多个线程之间的执行顺序和访问共享资源。线程同步可以避免多个线程同时访问共享资源导致的数据不一致和竞态条件。

Java提供了多种线程同步的机制,如synchronized关键字、Lock接口和各种同步容器类。这些机制可以确保在任意时刻只有一个线程访问共享资源,从而保证数据的一致性和可靠性。

下面是一个示例代码,演示了如何使用synchronized关键字进行线程同步:

public class ThreadSynchronizationExample {
    
    private static int count = 0;

    public static synchronized void increment() {
    
        count++;
    }

    public static void main(String[] args) throws InterruptedException {
    
        Thread t1 = new Thread(() -> {
    
            for (int i = 0; i < 1000; i++) {
    
                increment();
            }
        });

        Thread t2 = new Thread(() -> {
    
            for (int i = 0; i < 1000; i++) {
    
                increment();
            }
        });

        t1.start();
        t2.start();

        t1.join();
        t2.join();

        System.out.println("Count: " + count);
    }
}

3. 线程通信

线程通信是指多个线程之间的信息交换和协作。在多线程编程中,线程通信可以用于线程间的协调和同步,以实现一些复杂的任务。

Java提供了多种线程通信的机制,如wait()、notify()和notifyAll()方法、Condition接口和阻塞队列。这些机制可以实现线程的等待和唤醒、线程间的消息传递等功能。

下面是一个示例代码,演示了如何使用wait()和notify()方法进行线程通信:

public class ThreadCommunicationExample {
    
    public static void main(String[] args) {
    
        Message message = new Message();

        Thread senderThread = new Thread(() -> {
    
            String[] messages = {
    "Hello", "World", "Goodbye"};

            for (String msg : messages) {
    
                message.send(msg);
                try {
    
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
    
                    e.printStackTrace();
                }
            }
        });

        Thread receiverThread = new Thread(() -> {
    
            for (int i = 0; i < 3; i++) {
    
                String receivedMessage = message.receive();
                System.out.println("Received: " + receivedMessage);
            }
        });

        senderThread.start();
        receiverThread.start();
    }
}

class Message {
    
    private String message;
    private boolean isEmpty = true;

    public synchronized void send(String message) {
    
        while (!isEmpty) {
    
            try {
    
                wait();
            } catch (InterruptedException e) {
    
                e.printStackTrace();
            }
        }

        this.message = message;
        isEmpty = false;
        notify();
    }

    public synchronized String receive() {
    
        while (isEmpty) {
    
            try {
    
                wait();
            } catch (InterruptedException e) {
    
                e.printStackTrace();
            }
        }

        String receivedMessage = message;
        isEmpty = true;
        notify();
        return receivedMessage;
    }
}

总结

本文详细介绍了Java多线程编程的概念、原理和常用技术。多线程编程可以提高程序的性能和响应能力,但也需要注意线程安全和线程同步的问题。

在实际开发中,合理地使用多线程可以充分发挥多核处理器的优势,提高程序的并发能力和执行效率。同时,需要注意避免多线程之间的竞争条件和数据一致性问题,保证线程的安全性和正确性。

希望本文对你理解和应用Java多线程编程有所帮助!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_21484461/article/details/131406366

智能推荐

c语言库函数和头文件以及gcc下编译工程_gcc支持的c语言的图形库函数-程序员宅基地

文章浏览阅读1.8k次。一:windows下.dll动态链接库(相当于linux下的.a和.so文件,是源文件经过编译后的文件)在Windows世界中,有无数块活动的大陆,它们都有一个共同的名字——动态链接库。现在就走进这些神奇的活动大陆,找出它们隐藏已久的秘密吧!   初窥门径:Windows的基石  随便打开一个系统目录,一眼望去就能看到很多扩展名DLL的文件,这些就是经常说的“动态链接库”,DL_gcc支持的c语言的图形库函数

ESP8266 RTOS 下 Openssl 证书及使用和 Fragment 介绍_esp-idf 使用openssl-程序员宅基地

文章浏览阅读3k次。1 简介本文主要介绍基于 ESP8266_RTOS_SDK 的 SSL 加密使用方法,将分别介绍 ESP8266 作为 SSL client 和 SSL server 的使用方法。SSL 功能需要占用大量内存,请开发者在上层应用程序确保内存足够。在将 SSL fragment 设置为 8KB 以及证书用 private key RSA2048 的情况下, SSL 双向认证功能需要 30KB..._esp-idf 使用openssl

一文学会Spring,Spring最简单的入门教程(万字好文)_spring入门-程序员宅基地

文章浏览阅读8.3k次,点赞41次,收藏175次。spring教程_spring入门

统计学怎么求加权指数_暨南大学《统计学》中文习题 第十二章 统计指数-程序员宅基地

文章浏览阅读2.3k次。第十二章 统计指数(一)判断题1、 狭义指数是指反映社会经济现象变动与差异程度的相对数。( )是: 否:2、 广义上说,任何两个不同时间的同类指标的对比都可称为指数。( )是: 否:3、 在平均指标变动因素分析中,可变构成指数是专门用以反映总体构成变化影响的指数。( )是: 否:4、 在平均指标变动因素分析中,可变构成指数是专门用以反映总体构成变化影响的指数。 ( )是: 否:5、平均指标..._固定权数加权算术平均指数公式

浅谈接口加密_接口的数据交换是否有加密也应进行描述。-程序员宅基地

文章浏览阅读2.5k次。客户端在跟服务端进行数据交互的时候,比如登录操作,打开调试窗口,我们在输入用户名密码之后点击登录,可以看到我们调用的登录接口,在接口的返回数据中,可以看到登录的用户名和密码是明文显示,说明该接口没有进行加密操作。如果一个登录接口是加密的,那么我们在接口工具中直接使用用户名、密码登录是无法登录成功的,即使你的用户名密码正确,他还是会提示你的用户名密码不正确。......_接口的数据交换是否有加密也应进行描述。

Java基础之System.out.println("打印个七彩颜色字符串吧!")_java system.out.println 颜色-程序员宅基地

文章浏览阅读1.3w次,点赞22次,收藏54次。上代码class Hello{ public static void main(String[] args){ System.out.println("Hello,Akina!"); System.out.println("\033[30;4m" + "Hello,Akina!" + "\033[0m"); System.out.println("\03..._java system.out.println 颜色

随便推点

fastboot烧写hi3531_等待boot启动超时,单板上无fastboot或当前fastboot无法启动。 请检查当前progr-程序员宅基地

文章浏览阅读3.1k次。Boot Downloading started.Boot 100 % Downloaded.Boot Downloading completed!U-Boot 2010.06 (Jan 04 2014 - 09:35:56)DRAM: 256 MiBNAND: Special Nand id table Version 1.35Nand ID: 0x2C 0x88_等待boot启动超时,单板上无fastboot或当前fastboot无法启动。 请检查当前programm

ajax如何处理服务器返回的3种数据格式_ajxa返回的data-程序员宅基地

文章浏览阅读1.3w次,点赞2次,收藏22次。这篇东西本身是非常基础的,但是经常在处理ajax返回值的时候还是会犯各种小错误,所以就想到把这些方法结合以前写过的代码片段整理一下,方便以后复习和使用。另外呢,虽然能搜到很多类似的文档,但是整理一份自己的还是坠吼的= ̄ω ̄=ajax方法的参数常用的ajax参数比如url,data,type,包括预期返回类型dataType,发送到服务器的数据的编码类型contentTy_ajxa返回的data

栈溢出漏洞及栈溢出攻击_栈溢出漏洞产生的一些事件-程序员宅基地

文章浏览阅读1.2w次。1. 栈溢出的原因栈溢出(stack-based buffer overflows)算是安全界常见的漏洞。一方面因为程序员的疏忽,使用了 strcpy、sprintf 等不安全的函数,增加了栈溢出漏洞的可能。另一方面,因为栈上保存了函数的返回地址等信息,因此如果攻击者能任意覆盖栈上的数据,通常情况下就意味着他能修改程序的执行流程,从而造成更大的破坏。这种攻击方法就是栈溢出攻击(stack_栈溢出漏洞产生的一些事件

Express_前端express-程序员宅基地

文章浏览阅读1.7k次,点赞4次,收藏17次。初识 Express1.1 Express 简介1. 什么是 Express官方给出的概念:Express 是基于 Node.js 平台,快速、开放、极简的 Web 开发框架。 通俗的理解:Express 的作用和 Node.js 内置的 http 模块类似,是专门用来创建 Web 服务器的。 Express 的本质:就是一个 npm 上的第三方包,提供了快速创建 Web 服务器的便捷方法。Express 的中文官网: http://www.expressjs.com.cn/2. 进一步_前端express

java并发编程的十个坑,避免踩坑 收藏起来_java线程while true 坑-程序员宅基地

文章浏览阅读484次。java并发编程十大坑,收藏好,避免踩坑_java线程while true 坑

k8s查看容器_yks查看容器中服务-程序员宅基地

文章浏览阅读4.2k次。[root@hadoop03 k8s]# kubectl get podsNAME READY STATUS RESTARTS AGEnginx-controller-7c9j9 1/1 Running 0 44mnginx-controller-pfnr7 1/1 Running 0 44m[root@hadoop03 k8s]# ...[root@hadoop03 k8_yks查看容器中服务

推荐文章

热门文章

相关标签