从新手到大师:Java并发编程你必须知道的那些事!

news2024/11/15 23:49:10

在这里插入图片描述

文章目录

    • 1 进程和线程的区别?
    • 2 如何创建一个线程实例并且运行它?
    • 3 Runnable 和 Callable 接口有什么区别?它们是如何使用的?
    • 4 方法定义中 synchronized 关键字的含义是什么?静态方法?在一个块之前 ?

1 进程和线程的区别?

进程是独立的执行单元,拥有自己的资源和内存,而线程是在进程内的执行单元,共享进程的资源。线程可以高效地执行任务,但需要注意共享资源时的同步问题。进程则提供了更高的隔离度,适用于需要较强隔离的场景。

进程可以看作是计算机上运行的程序的一个实例。每个进程都有自己的内存空间和资源,像是一座独立的工厂,每个工厂都拥有自己的机器、员工和原材料,相互之间没有直接的干扰。

进程之间的通信和数据交换比较复杂,通常需要通过操作系统提供的机制,比如管道、文件或网络进行。

进程是操作系统中资源分配的基本单位,每个进程都有一个唯一的进程标识符(PID)。

线程则是进程中的一个执行单元。可以把线程看作是工厂中的一个员工,它们共享工厂的资源,如机器和原材料,但每个员工有自己的工作任务。

线程之间可以很方便地共享数据和资源,因为它们都在同一个进程内,线程的创建和销毁开销比进程小得多,但因为共享资源,线程之间的协调和同步变得更加重要。

实际例子,比如浏览器。每个浏览器窗口或标签页通常就是一个进程,这样即使一个标签页崩溃,其他标签页也不会受影响。每个标签页中的操作,比如加载网页、执行JavaScript脚本等,都是由不同的线程来处理的,这些线程共享同一个标签页的内存空间,从而可以更高效地进行任务。

创建一个新的进程可能需要比较大的开销,因为操作系统需要为这个进程分配独立的内存空间和资源。

使用 ProcessBuilder 在Java中创建新进程

ProcessBuilder processBuilder = new ProcessBuilder("text.exe");
// 启动一个新的进程,独立于当前进程运行
Process process = processBuilder.start();

相比之下,创建线程的开销要小得多,线程可以在同一进程内共享资源。

创建线程Demo

public class MyThread extends Thread {
    public void run() {
        System.out.println("Thread is running");
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        // 启动一个新的线程,这个线程与主线程共享相同的进程资源
        thread.start(); 
    }
}

2 如何创建一个线程实例并且运行它?

创建和运行一个线程实例是进行多任务处理的重要步骤,线程允许程序同时执行多个任务,提高了应用的效率和响应能力。

通过定义一个类来创建一个线程实例,这个类通常需要继承自一个线程基类,或者实现一个线程接口。

线程的创建过程涉及到两个主要步骤:定义线程的工作内容启动线程

定义线程的工作内容的方式有多种。一种常见的方法是创建一个新的类,并继承自线程类。这个新类需要重写一个特定的方法,这个方法中包含了线程在运行时要执行的任务。

定义一个线程类Demo:

public class MyThread extends Thread {
    @Override
    public void run() {
        // 线程要执行的任务
        System.out.println("运行ing");
    }
}

创建线程实例后,接下来需要启动线程,通过调用线程实例的 start 方法完成的。调用 start 方法会让线程进入就绪状态,然后操作系统会调度线程的执行。调用 start 方法不会直接运行线程,而是将线程放入一个待执行的队列中,操作系统会选择合适的时机来执行它。

创建并启动线程Demo

public class Main {
    public static void main(String[] args) {
        // 创建线程实例
        MyThread thread = new MyThread();
        // 启动线程,触发 MyThread 的 run 方法执行
        thread.start();
    }
}

在另一种方法中,也可以通过实现一个线程接口来创建线程。假设有一个接口 Runnable,其中包含一个 run 方法。在实现这个接口的类中,run 方法同样需要包含线程的任务代码。通过将实现了 Runnable 接口的对象传递给一个线程实例,可以实现线程的创建和运行。

实现 Runnable 接口Demo:

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        // 线程要执行的任务
        System.out.println("运行ing");
    }
}

public class Main {
    public static void main(String[] args) {
        // 创建 Runnable 实例
        MyRunnable myRunnable = new MyRunnable();
        // 创建线程实例,将 Runnable 实例传递给线程
        Thread thread = new Thread(myRunnable);
        // 启动线程
        thread.start();
    }
}

3 Runnable 和 Callable 接口有什么区别?它们是如何使用的?

RunnableCallable 用于并发编程的两个接口,它们允许在多线程环境中执行任务,但有一些重要的区别。

Runnable 接口定义了一个方法 run(),这个方法中的代码是线程执行的主体。

Runnable 适合用于不需要返回结果的任务,比如更新用户界面或处理日志,它无法直接返回结果,且不能抛出受检查异常Runnable接口的Demo在上方

Callable 接口不仅定义了任务的代码,还允许任务返回一个结果

Callablecall() 方法会返回一个值,这个值可以用来表示任务的结果。与 Runnable 不同,Callable 可以抛出受检查异常,这让它能处理更复杂的错误情况。为了获取 Callable 执行的结果,通常需要配合 Future 对象使用。

实现 Callable 接口Demo:

import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;

public class MyCallable implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        // 返回一个结果
        return 42; 
    }
}

public class Main {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<Integer> future = executor.submit(new MyCallable());
        // 获取 Callable 任务的结果
        Integer result = future.get(); 
        System.out.println("任务结果: " + result);
        executor.shutdown();
    }
}

RunnableCallable 的选择取决于任务是否需要返回值和是否需要处理受检查异常。Runnable 适合简单的任务,Callable 更适合需要返回结果或处理异常的复杂任务。

4 方法定义中 synchronized 关键字的含义是什么?静态方法?在一个块之前 ?

synchronized 关键字用于实现线程同步,解决多线程环境中资源竞争的问题。通过在方法或代码块上使用 synchronized,可以确保同一时间只有一个线程能够执行这段代码,从而避免数据不一致或其他并发问题。

synchronized 关键字用于方法时,它会锁定整个对象

展示了一个实例方法如何使用 synchronized

public class MyClass {
    public synchronized void synchronizedMethod() {
        // 每次只有一个线程可以进入这个方法,其他线程必须等待,直到第一个线程执行完成并释放锁
    }
}

synchronized 用于静态方法,它会锁定整个类的对象

意味着所有该类的实例共享同一个锁,静态方法使用 synchronized

public class MyClass {
    public static synchronized void synchronizedStaticMethod() {
        // 确保了在同一时刻,只有一个线程能够执行这个类的静态同步方法
    }
}

synchronized 用于代码块,而不是整个方法,这样做的好处是可以只锁定代码块中真正需要同步的部分

代码块使用synchronized

public class MyClass {
    // lock 对象用于控制代码块的访问
    private final Object lock = new Object();

    public void someMethod() {
        // 只有持有 lock 锁的线程才能执行代码块中的代码
        synchronized (lock) {
            // 使用代码块同步时,可以控制锁定的范围,从而提高程序的效率和性能
        }
    }
}

苦难是人生的老师,通过苦难,走向欢乐

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2110838.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux 内核代码学习(八)

总体目标&#xff1a;由于fedora10 linux发行版中自带的linux2.6.xx内核源码规模太庞大了&#xff0c;对于想通读内核源码的爱好者来说太困难了&#xff0c;因此选择了linux2.4.20内核来进行测试&#xff08;最终是希望能够实现linux1.0内核的源码完全编译和测试&#xff09;。…

《互联网内容审核实战》:搭建团队到绩效激励,一书在手全搞定!“

&#x1f310;在数字时代的浩瀚海洋中&#xff0c;互联网视频、图片、文字等内容如同潮水般汹涌澎湃&#xff0c;它们以惊人的速度传播&#xff0c;连接着世界的每一个角落。这股信息洪流不仅丰富了我们的视野&#xff0c;也带来了前所未有的挑战——如何在享受信息便利的同时&…

docker-compose 快速部署nacos2.3.1-standalone单节点

一、nacos 介绍 官网&#xff1a; https://nacos.io/ 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台 二、如何使用docker-compose 快速部署nacos2.3.1 ⚠️ &#xff1a; nacos-standalone 部署方式 依赖于 数据库&#xff0c;请先配置好数据库实例&…

如何利用AI快速总结论文文献内容?试试这2款大学生必备文献翻译神器

推荐2款支持AI快速总结论文文献内容的神器&#xff01; 1、包阅AI 点击链接直达官网>>https://baoyueai.com/ 一款高效提取文字信息的AI阅读工具&#xff0c;上传文献就能帮你快速完成【全文概述、分章节总结、智能导读】等&#xff0c;非常适用于总结论文文献内容。 支…

AI流程编排产品调研实践

随着AI技术的发展&#xff0c;AI应用和相关的生态也在不断地蓬勃发展&#xff0c;孵化这些AI应用的平台也在这几年也逐渐成熟。大模型应用开发平台像是淘金者必不可少的铲子一样&#xff0c;成为很多云平台厂商和互联网公司必不可少的平台与工具。 提起大模型流程编排或者大模型…

CSDN的Markdown编辑器语法

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

4个图片编辑神器,简单好用,可以快速出图

图片编辑是我们生活中常见的需求&#xff0c;有很多好用的图片编辑软件可以推荐&#xff0c;按照端口不同可以给大家分享4个分别在电脑和手机上使用的图片编辑神器&#xff0c;简单好用&#xff0c;可以快速出图。 一、电脑软件 1.改图鸭 图片编辑软件中的全能选手&#xff0…

CleanMyMac X2024最新官方中文破解版本下载

&#x1f9f9; 嘿&#xff0c;Mac用户们&#xff0c;你们的小助手来了&#xff01; 今天要跟大家分享的&#xff0c;是一个能让你们的电脑焕发新生的神器——CleanMyMac X。这可不是一般的清洁工&#xff0c;它可是拥有超能力的超级英雄哦&#xff01;&#x1f31f; CleanMyMa…

AIGC与数据分析融合,引领商业智能新变革(TOP企业实践)

AIGC与数据分析融合&#xff0c;引领商业智能新变革&#xff08;TOP企业实践&#xff09; 前言AIGC与数据分析融合 前言 在当今数字化时代&#xff0c;数据已成为企业发展的核心资产&#xff0c;而如何从海量数据中挖掘出有价值的信息&#xff0c;成为了企业面临的重要挑战。随…

索尼的Web3蓝图:从技术创新到现实应用的全方位布局

近年来&#xff0c;随着区块链技术和加密资产的迅猛发展&#xff0c;全球科技巨头纷纷投入其中&#xff0c;力图在Web3浪潮中占据一席之地。作为传统科技行业的巨头&#xff0c;索尼(Sony)也不甘落后&#xff0c;积极推动其Web3战略布局&#xff0c;展现出其在新兴领域的强烈野…

OpenHarmony鸿蒙开发( Beta5.0)智能手表应用开发实践

样例简介 本项目是基于BearPi套件开发的智能儿童手表系统&#xff0c;该系统通过与GSM模块&#xff08;型号&#xff1a;SIM808&#xff09;的通信来实现通话和定位功能。 智能儿童手表系统可以通过云和手机建立连接&#xff0c;同步时间和获取天气信息&#xff0c;通过手机下…

Qt/C++开源项目 TCP客户端调试助手(源码分享+发布链接下载)

这是一个TCP客户端调试助手&#xff0c;具有简洁直观的界面&#xff0c;用户能够方便地测试TCP协议的通信功能&#xff0c;并可同时作为客户端与服务器端使用。以下是该程序的功能特点及用途介绍&#xff1a; 功能特点&#xff1a; TCP客户端与服务器调试&#xff1a;支持同时…

C++11 --- 可变参数模板

序言 不知道大家有没有细细研究过在 C 语言 中的 printf 函数&#xff0c;也许我们经常使用他&#xff0c;但是我们可能并不是那么了解他。先看一下调用格式&#xff1a;int printf ( const char * format, ... );&#xff0c;在这里的 format 代表我们的输出格式&#xff0c;后…

若依库存管理 ruoyi-wms V2.0发布:升级到jdk17和vue3,支持一物一码

开源地址 https://gitee.com/zccbbg/wms-ruoyi 项目代码、文档 均开源免费可商用 遵循开源协议在项目中保留开源协议文件即可 活到老写到老 为兴趣而开源 为学习而开源 为让大家真正可以学到技术而开源 若依wms是一套基于若依的wms仓库管理系统&#xff0c;支持lodop和网页…

Windows环境虚拟机安装

一、软件安装 1. vmware官网地址 点进去选这个products 然后往下滑选这个查看桌面虚拟机管理程序 然后点击这个桌面虚拟机管理程序 然后下拉找到download now下载 然后会跳转到broadcom网站&#xff0c;选择注册账号,这里我是使用谷歌邮箱注册的 注册完之后点击这个链接&…

【LeetCode】07.整数反转

题目要求 解题思路 这道题的难点在于怎么判断越界&#xff0c;我们无法直接与最大值或最小值比较&#xff0c;但是由于每一次我们的ret都需要乘10这个特性来使用ret与最大值或最小值除10进行比较 代码实现 class Solution { public:int reverse(int x) {int ret0;while(x){…

JS生成二维码QRCode代码

JavaScript是一种广泛使用的前端编程语言&#xff0c;它不仅用于网页交互&#xff0c;还可以实现许多实用功能&#xff0c;如生成二维码。本篇文章将深入探讨如何使用JavaScript生成二维码&#xff0c;以及如何确保这种生成的二维码在各种浏览器和手机端都能正常工作&#xff0…

C语言-程序环境 #预处理 #编译 #汇编 #链接 #执行环境

文章目录 前言 一、程序的环境翻译和执行环境 二、翻译环境 (一)、整体把握 (一)、编译 1、预处理(预编译) 2、编译 a、词法分析 b、语法分析 c、语义分析 d、符号汇总 3、汇编 (二)、链接 三、运行环境 总结​​​​​​​ 前言 路漫漫其修远兮&#xff0c;吾将…

波导模式分析2 用于圆TE01模式高功率传输线的大型多模波导滤波器

摘要&#xff1a; 一种对于大型多模波导滤波器的设计方法&#xff0c;其能衰减掉&#xff08;deteriorate&#xff09;不想要的模式而不影响所需要的工作模式&#xff0c;被提出来抑制用于圆TE01模式高功率传输线的受限模式谐振。为了从TE10模式中分离出不期望的模式&#xff…

【蓝桥杯嵌入式(二)Led、Key、Lcd】

蓝桥杯嵌入式&#xff08;二&#xff09;Led、Key、Lcd 五、Led模块1.原理图配置2. 知识点3.底层代码 六、Key模块1.原理图配置2.知识点3.底层代码底层代码&#xff08;四⾏代码版本&#xff09;底层代码&#xff08;状态机版本&#xff09; 七、LCD模块1.原理图配置2.知识点底…