java学习之浅谈多线程1

水货程序员之多线程踩坑记 ——浅谈 CRUD 工程师的多线程套路 作为一个每天从早到晚 CRUD 的工程师,多线程技术虽然不天天用,却也是不得不学的一部分。就算不写多线程,面试时“你对多线程的理解”这类问题也是绕不过去的坎。最糟糕的是,在实际项目中应用多线程技术时,由于理解不透彻,很容易掉进“水货程序员”们都踩过的那些坑。今天这篇文章,就是来帮各位小伙伴们理清多线程中的“雷区”有哪些,并总结了一些踩坑经验和避坑建议。希望在看完这篇之后,CRUD 工程师们也能稳稳当当地在多线程的世界里畅游!线程是进程中的执行单元,负责执行具体的代码。 阅读详情
  1. 创建任务和线程
    任务就是对象,为了创建任务,必须首先为任务定义一个类。任务类必须实现Runnable接口。Runnable接口非常简单,它只有一个run方法。需要实现这个方法来告诉系统线程将如何运行。
    任务必须在线程中执行。Thread类包括创建线程的构造方法以及控制线程的很多有用的方法。
+Thread()                       创建一个空线程
+Thread(task:Runnable)          为指定任务创建一个线程

+start():void                   启动线程使方法run()被JVM调用
+isAlive():boolean              测试线程当前是否正在运行
+setPriority(p:int):void        测试线程的优先级(范围从1到10)
+join():void                    等待线程结束
+sleep(millis:long):void        使线程睡眠指定的数
+yield():void                   使线程暂停并允许执行其他线程
+interrupt():void               中断线程

使用下面的语句创建任务的线程:

Thread thread = new Thread(task);

然后调用start()方法告诉java虚拟机该线程准备允许,它会导致任务中的run()方法被执行。当run()方法执行完毕,线程就终止。

thread.start();

注意:因为Thread类实现了Runnable,所以,可以定义一个Thread的扩展类,并实现run方法,然后创建这个类的一个对象,并且调用它的start方法来启动线程。但是,不推荐使用这种方法,因为它将任务和运行任务的机制混在了一起。将任务从线程中分离出来是比较好的设计。

2.线程池
使用Thread类创建一个线程来运行任务对单一任务的执行是很方便的,但是由于必须为每一任务创建一个线程,因此对大量的任务而言是不够高效的。线程池是管理并开发执行任务个数的理想方法。java提供Executor接口来执行线程池中的任务,提供ExecutorService接口来管理和控制任务。ExecutorService是Executor的子接口。
Executor类:

+execute(Runnable object):void

ExecutorService类:

+shutdown():void    关闭执行器,但允许完成执行器中的任务。一旦关闭,它就不能接受新任务
+shutdownNow():List<Runnable>   即使线程池中还有未完成的线程,还是会立即关闭执行器。返回未完成任务的清单
+isShutdown():boolean   如果执行器已被关闭则返回true
+isTerminated():boolean 如果线程池中所有的任务都被终止,则返回true

为了创建一个Executor对象,可以使用Executors类中的静态方法。
Executors类:

+newFixedThreadPool(numberOfThreads:int):ExecutorService
    创建一个线程池,该线程池可并发执行的线程数固定不变。
    在线程的当前任务结束后,它可以被重用以执行另一个任务
+newCachedThreadPool():ExecutorService  
    创建一个线程池,它可按需创建新线程,但当前面创建的线程可用时,
    则重用它们

3.程序实例(打印字母100次)
使用Thread类:

public class TaskThreadDemo {

    public static void main(String[] args) {
        PrintChar printA = new PrintChar('A', 100);
        PrintChar printB = new PrintChar('B', 100);

        Thread thread1 = new Thread(printA);
        Thread thread2 = new Thread(printB);

        thread1.start();
        thread2.start();
    }

}

class PrintChar implements Runnable {

    private int times;
    private char charToPrint;

    public PrintChar(char cha, int a) {
        this.charToPrint = cha;
        this.times =a;
    }

    @Override
    public void run() {
        for(int i=0; i<times; i++) {
            System.out.print(charToPrint + " ");
        }
    }

}

使用线程池:

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

public class ExecutorDemo {
    public static void main(String[] args) {
        //创建一个线程池,该线程池可并发执行的线程数固定不变,在线程的当前任务结束后,它可以被重用以执行另一个任务
        ExecutorService executors = Executors.newFixedThreadPool(3);

        //创建一个线程池,它可以按需创建新线程,但当前面创建的线程可用时,则重用它们
        ExecutorService executorService = Executors.newCachedThreadPool();

        executorService.execute(new PrintChar1('A', 100));
        executorService.execute(new PrintChar1('B', 100));

        executorService.shutdown();

//      executors.execute(new PrintChar1('A', 100));
//      executors.execute(new PrintChar1('B', 100));

//      executors.shutdown();
    }
}

class PrintChar1 implements Runnable {

    private int times;
    private char charToPrint;

    public PrintChar1(char cha, int a) {
        this.charToPrint = cha;
        this.times =a;
    }

    @Override
    public void run() {
        for(int i=0; i<times; i++) {
            System.out.print(charToPrint + " ");
        }
    }

}
Anaconda+Pycharm安装 我提前创建好一个自己项目所需的虚拟环境。步骤是:打开终端(cmd)或者 搜索 ”Anaconda Prompt“ 并打开,输入 conda create -n pytorch python=3.9 -c。 阅读详情

相关推荐

MedicalNet实战:3D医疗影像分割从零到部署(PyTorch+ResNet50)

本文详细介绍了基于PyTorch和MedicalNet预训练模型进行3D医疗影像分割的完整实战流程。通过加载ResNet50预训练权重进行迁移学习,大幅降低了对标注数据量的需求,并提升了模型性能。文章涵盖了从数据准备、模型微调、训练优化到最终部署的每一步,为医疗AI开发者提供了从零到部署的清晰指南。

weixin_29062671的博客 587

浅谈Java多线程的同步问题

多线程的同步依靠的是对象锁机制,synchronized关键字的背后就是利用了封锁来实现对共享资源的互斥访问。

Java干货 626

N5105 PVE UEFI核显直通Windows:从黑屏到HDMI输出的实战调优

本文详细介绍了在N5105处理器上实现PVE UEFI核显直通Windows的实战调优方法。针对黑屏和HDMI音频无法识别等常见问题,提供了系统参数调整、驱动模块加载、虚拟机配置等解决方案,帮助用户成功实现核显直通并优化性能。

weixin_42566424的博客 203

Java之多线程知识理解(浅谈)

多线程之快速入门 线程与进程的区别 简单理解:进程就是应用程序(每个正在系统上运行的程序都是一个进程),每个进程包括多个线程。而线程是一组指令的集合,可以在程序里独立执行,一般把线程理解为轻量级的进程。 具体化理解: 在一台电脑里面小明发现有多个APP,想要边用网易云听歌边用idea写代码还想边用迅雷下载学习资料,然后使用迅雷发现有以前的多个未完成的下载的任务于是开始多个下载。在该案...

学习无止境、创作无瓶颈 539

unet学习笔记(milesial/Pytorch-UNet)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 unet学习笔记(milesial/Pytorch-UNet)原理讲解unet_parts.py内容predict.py内容 所用到的代码Pytorch-UNet/predict.py at master · milesial/Pytorch-UNet ·GitHub 原理讲解 蓝/白色框表示 feature map; 蓝色箭头表示 3x3 卷积,用于特征提取; 灰色箭头表示skip-connection,用于特征融合; 红色箭头.

weixin_67138138的博客 2553

Anki小白必看:手把手教你打造高颜值个性化笔记模板(附Leaflyer模板下载)

本文为Anki新手提供详细的个性化笔记模板设计指南,从基础配置到高级定制技巧,帮助用户打造高效记忆系统。特别推荐Leaflyer模板下载,通过视觉优化和功能强化,显著提升学习体验和记忆效率。

weixin_28717969的博客 433

大聪明教你学Java | 带你学习Java多线程(续:创建线程的其他方式与activeCount方法的浅谈)

前言 相信每一位程序猿对“多线程”这个概念应该都不陌生,无论是在开发还是面试的时候,都会遇到多线程的问题。不过,一定有很多小伙伴才刚刚接触到多线程,那么在此就由小弟为各位小伙伴细细说说什么是多线程。 在开始之前,先简单介绍一下什么是线程~ Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 多线程是实现并发机制的一种有效手段。进程和线程一样,都是实现并发的一个基本单位。线程是比进程更小的执行单位,线程是进程的基础之上进

不肯过江东丶 8177

Python+OpenCV实战:5分钟搞定机械臂手眼标定(眼在手上模式)

本文详细介绍了使用Python和OpenCV在5分钟内完成机械臂手眼标定(眼在手上模式)的实战教程。通过解析相机坐标系与机械臂基坐标系的转换关系,提供从数据采集到标定矩阵计算的全流程代码实现,帮助开发者快速解决AX=XB问题,提升机械臂视觉引导精度。

weixin_33670786的博客 495

C个java都是多线程语言对吗_Java初探:浅谈Java语言和C语言的区别

通过这一周对《Java语言导学》的学习,我对Java语言有了基本的了解。下面我将对Java语言和C语言进行比较,以此为切入点,谈谈我对Java语言的理解。一.编程思想不同这是Java和C的一个根本区别。C语言是一种过程式语言,较为简单直观,它是Java,C++等高级语言的基础。而Java是一种面向对象的语言。何谓“面向对象”?以我的理解,“面向对象”中包涵的思想是对实际物体的抽象与重塑。以自行车为...

weixin_35749796的博客 1186

保姆级教程:在树莓派5B上用AI Kit跑YOLOv8,实测134fps的完整配置流程

本文提供了一份详细的树莓派5B搭配AI Kit部署YOLOv8的教程,从硬件组装到模型转换、优化和部署,最终实现134FPS的高帧率推理性能。通过Hailo-8L AI加速模块和HEF模型转换,这套方案为边缘AI计算提供了强大支持,适用于智能监控、无人机视觉导航等应用场景。

weixin_28725407的博客 444

Netapp FAS2750热备盘替换失败问题分析与解决

本文深入分析了Netapp FAS2750存储系统中热备盘替换失败的故障现象,揭示了磁盘分区属主不匹配导致数据同步无法启动的根本原因。通过详细的排查步骤和解决方案,帮助运维人员快速恢复aggr状态,并提供了长期预防措施和最佳实践建议,确保存储系统的高可用性。

weixin_33737774的博客 399

浅谈Java多线程

       学习目标,我们要弄明白线程是什么?为什么要用线程?线程和进程的区别和联系?线程为什么有用以及怎么开始编写使用线程的简单程序。        何为线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。那多线程呢?        多线程:在同一应用程序中有多个顺序流(同时)执行。        进程:每个进程都有独立的代码和数据空间(进程上...

小红妹 529

手把手教你学Simulink--基于储能系统的建模与仿真场景:-锂电池储能系统充放电管理策略仿真

《锂电池储能系统充放电管理的Simulink建模与仿真》摘要 本文详细介绍了使用Simulink+SimscapeElectrical对锂电池储能系统进行充放电管理策略建模的全过程。从系统结构设计入手,重点阐述了锂电池模型、充放电控制器、热管理系统等核心模块的搭建方法,并提供了完整的仿真流程。文章详细说明了如何实现荷电状态管理、温度控制和功率限制等关键策略,通过仿真分析了电池电压、电流、SoC和温度等关键指标的变化规律。最后提出了基于仿真结果的优化建议,包括参数整定、算法改进等方面,为锂电池储能系统的安全高

MHD0815的博客 1万+

Redis系列-1.Redis浅谈

模拟一个tcp服务器处理30个客户socket。第一种选择(轮询):按顺序逐个验收,先验收A,然后是B,之后是C、D。。。这中间如果有一个学生卡住,全班都会被耽误,你用循环挨个处理socket,根本不具有并发能力。第二种选择(来一个new一个,1对1服务):你创建30个分身线程,每个分身线程检查一个学生的答案是否正确。这种类似于为每一个用户创建一个进程或者线程处理连接。第三种选择(响应式处理,1对多服务),你站在讲台上等,谁解答完谁举手。

爱吃知识的土豆倪的博客 1538

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java多线程之内存可见性(浅谈synchronize 和volatile)

注:本博客是慕课网的一个免费课程的学习笔记, 有兴趣的同学可以去看看: 细说Java多线程之内存可见性 什么是内存可见性?      可见性: 一个线程对共享变量值的修改,能够及时地被其他线程看到 什么是共享变量?      共享变量:如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量 什么是JMM?      Java内存模型JMM(Java Memo...

weixin_42354330的博客 2344

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

#软件构造# 浅谈Java多线程 -暨软件构造Lab6记录

欢迎访问个人博客:https://lyp123.com 终于完成所有的lab了,在最后的这个lab里面接触到了多线程,甚感其高效也有感于其危险的地方,这里就大概记录一下,以免以后需跳坑。 1.Java多线程入门 1.1 Thread类与Runnable接口 要学习Java多线程,首当其冲的就是Thread类和基于这个类的Runnable接口,这里不多做解释,大家直接看代码就好。 /** *方法...

小明难亡 772

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

浅谈Java线程学习(注释心得)

话说,线程是为了java程序能够获得更高的执行效率,而引入的一个概念。所谓的线程,就是一个可以独立、并发执行的程序单元。而,多线程是指,程序中同时存在多个执行体,各线程按照自己的执行路线并发的工作,独立完成各自的功能,互不干扰。就好像,我们能够在计算机上,同时听音乐和上网浏览信息一样。这种执行效果是不是很好。 线程的生命周期,就像我们学习android中的activity类也有自己的生命周期,以

博-Lewis' home 1550

java学习之浅谈多线程2--线程同步

如果一个共享资源被多个线程同时访问,可能会遭到破坏。举个例子说明这个问题,假设创建并启动100个线程,每个线程都往同一个账户中添加一个便士,代码如下: import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;public class AccountWithSync { privat

devin的专栏 504

浅谈java多线程(一)

在我们学习java的线程时首先我们来了解两个两个概念:1.什么是进程  2.什么是线程 1.进程:程序是指令和数据的有序集合,它本身没有任何运行的含义,是个静态的概念而我们所说的进程是程序在处理机上的一次执行过程,它是一个动态的概念,他是一个具有独立的功能的程序,是一个实体,每一个进程都有自己的地址空间,简单来说,我们在计算机上打开一个我们编程用的eclipse编译软件,或者打开一个音乐播放器就...

qq_42512179的博客 262

Java初探:浅谈Java语言和C语言的区别

通过这一周对《Java语言导学》的学习,我对Java语言有了基本的了解。下面我将对Java语言和C语言进行比较,以此为切入点,谈谈我对Java语言的理解。一.编程思想不同这是Java和C的一个根本区别。C语言是一种过程式语言,较为简单直观,它是Java,C++等高级语言的基础。而Java是一种面向对象的语言。何谓“面向对象”?以我的理解,“面向对象”中包涵的思想是对实际物体的抽象与重塑。以自行车为例,每辆自行车都是一个对象,但我们可以忽略每辆自行车一些无关紧要的区别,抓住它们的共同之处,将所有的自行车抽象为

YUYU_0908的专栏 2378

浅谈多进程多线程的选择

在看thinking in java 的 并发 章节时,里面有这样一句话:实现并发的最简单的方式就是多进程,但没有进一步的解释说明,然后后面都在讲多线程编程,当时就有疑惑,那到底多进程和多线程该如何选择, 网上找答案时,发现这篇文章总结的比较到位,遂转来分享学习。完整的原文包括一些简单的数据测试,具体可以看原博客。 ---------------------------------------...

zxh2075的专栏 367

【Java】线程同步:从多线程小球浅谈 synchronized 的使用

最近刚开始学习多线程,写小球碰撞过程中遇到了问题: 多个线程小球在运动时,画布上会出现残影: 画小球的主要方法是设置画笔为背景色 - 画小球 - 设置画笔随机颜色 - 画小球,再通过调用另一个 move 方法让它们动起来,这样就能起到一个擦除轨迹实现运动的效果。关键代码如下: //擦除小球 public void drawDelect(){ g.setColor(Color.lightG...

qq_44577070的博客 524

多线程编程的简单案例——单例模式[多线程编程篇(3)]

如何简单的去使用jconsloe 查看线程 (多线程编程篇1)_eclipse查看线程-优快云博客浅谈Thread类及常见方法与线程的状态(多线程编程篇2)_thread.join() 和thread.get()-优快云博客这是系列的第三篇博客,这篇博客笔者想结合自己的学习经历,分享几个多线程编程的简单案例,帮助读者们更快的理解多线程编程,也非常感激能耐心阅读本系列博客的读者们!本篇博客的内容如下,您可以通过目录导航直接传送过去1.介绍wait()和notify()这两个方法2.介绍单例模式。

cjejwe的博客 2618

教你学Java | 带你学习Java多线程(续:创建线程的其他方式与activeCount方法的浅谈)

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,。相信每一位程序猿对“多线程”这个概念应该都不陌生,无论是在开发还是面试的时候,都会遇到多线程的问题。不过,一定有很多小伙伴才刚刚接触到多线程,那么在此就由小弟为各位小伙伴细细说说什么是多线程。在开始之前,先简单介绍一下什么是线程~Java 给多线程编程提供了内置的支持。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。多线程是实现并发机制的一种有效手段。

xhbzl的博客 276
上一篇: Eclipse插件Fat Jar
下一篇: java学习之浅谈多线程2--线程同步
zhangxinbetter
博客等级 码龄12年 5粉丝 10原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值