Java基础之线程初接触

说说我们每天接触的Java锁吧 背景: 不管是做Java开发、C开发、IOS开发还是Android开发,都会遇到多线程开发的需求场景。那么问题就来了,多线程开发时无法避免的就要考虑线程安全和线程通信的问题。今天我们主要讲讲线程安全问题,Android中可能大家用synchronized关键字用多了、久了就对锁的概念缺乏了认知,所以这里就简单回顾补充一下这方面知识。 一、线程并发访问的问题 程序运行时JVM会将我们的内存分成线程私有和线程公有两大块,这个在之前的内存优化篇章里面也有详细的介绍过,这里就不再... 阅读详情

1.线程的概述

1.进程的定义:一个正在执行中的程序 每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者叫一个控制单元。

2.线程的定义:进程中的一个独立的控制单元,线程控制着进程的执行。

3.进程中至少有一个线程(且java中该线程的代码存在于main方法中,因此称其为主线程)

4.使用多线程的意义:
-实现同时运行的目的
-提高下载效率[如下载工具某雷]

5.一个新的线程就是一个新的执行路径,CPU快速不停地在各个线程间进行切换(表现为各线程抢夺执行权),以达到看似同时运行的效果
多线程的一个特性:随机性


2.创建线程

1.继承Thread类:

步骤:
-定义一个类继承Thread类
-复写Thread类中的run方法 ,run中放置需要在线程中运行的代码
-实例化该类,调用start方法[启动线程,调用run方法]

说明:若直接调用run方法,则没有启动线程。程序依旧是单线程运行

说明:在继承Thread的子类构造方法中注意super()的使用

示例代码:

//自定义线程类
class MyThread extends Thread{  
    public MyThread(String name){       
        super(name);//直接使用
    }
    //复写run方法
    public void run(){
        for(int i=0;i<50;i++){          
            System.out.println(this.getName()+" run"+i);
        }
    }
}


public class ThreadManager {

    public static void main(String[] args) {
        MyThread thread=new MyThread("新的线程");//新建线程
        thread.start();//启动线程       
    }

}

2.实现Runnable接口:

步骤:
- 定义类实现Runnable接口[implements关键字]
- 复写Runnable接口中的run方法
- 通过Thread类创建新的线程(将实现Runnable接口的子类对象作为实参传递给Thread的构造方法)
- 调用Thread中的start方法开启线程并调用Runnable接口子类中的run方法

编程思想:如果程序员只需要重写thread中的run方法,而不重写其他thread方法,应该实现runnable接口。因为除非程序员打算修改或增强类的基本行为,否则不应该为该类创建对象。

示例代码:

//实现Runnable的线程类
class MyNewThread implements Runnable{

    public void run() {      
        System.out.println("线程执行...");
    }

}

public class ThreadManagerByIm {

    public static void main(String[] args) {
        MyNewThread thread=new MyNewThread();
        Thread newThread=new Thread(thread);//以Runnable的实现类为实参实例化Thread
        newThread.start();//启动线程         
    }

}

3.实现Runnable方式与继承Thread方式创建线程的区别

  • 实现Runnable方式可以避免单继承的局限性[!important]
  • 实现Runnable方式使得对象中的资源可以被共享
  • 两种方式下线程代码的存放的位置有所不同

3.线程的状态

1.线程对象及名称

Thread currentThread()
返回对当前正在执行的线程对象的引用

String getName()
返回该线程的名称

void setName(String name)
改变线程名称,使之与参数 name 相同

2.线程状态一览

这里写图片描述

线程状态说明
新建线程新建
就绪线程运行start方法
运行线程获得CPU资源,即获得CPU执行权
阻塞线程处于等待或休眠状态,线程此时具有具备运行资格但没有执行权
死亡线程彻底结束

4.线程安全性问题

1.实例引入

//售票窗口类
class TicSale implements Runnable{
    private int ticket=100;//票数
    @Override
    public void run() {      
        while(true){
            if(ticket>0){
                try{
                    //令线程短暂休眠
                   Thread.sleep(10);    
                    }catch(Exception e){}                System.out.println(Thread.currentThread().getName()+"当前售出票号:"+ticket--);
            }
        }
    }

}

public class SaleTic {

    public static void main(String[] args) {
        TicSale ts=new TicSale();
        //用两个线程模拟双窗口售票
        Thread t1=new Thread(ts);
        Thread t2=new Thread(ts);
        t1.start();
        t2.start();
    }

}

运行结果:

…
…
Thread-0当前售出票号:2
Thread-1当前售出票号:2
Thread-0当前售出票号:1
Thread-1当前售出票号:1
…
…

在本例中,由于令售票线程短暂休眠,导致最终售票的结果出现异常情况。由此,可以体会到当多线程对共享数据进行操作时,存在一定的安全性问题。

2.出现安全性问题的原因

当多条语句在操作同一个共享数据时,一个线程对多条语句只执行了一部分(如中途进入休眠状态),另一个线程参与进来执行,就将导致共享数据的错误。

一个可行的解决方案:对多条操作共享数据的语句,只有当一个线程执行完,其他线程才能执行

3.多线程同步代码块

格式:

synchronized(被操作的共享资源所属的对象){
    //需要被同步的代码(操作共享数据的语句)
}

说明:需要被同步的对象一般可称为同步锁,一般为this 或是被操作的共享资源所属的对象(理论上任何对象都可以)。持有锁的线程可以在同步中执行,没有持有锁的线程即使获取了CPU的执行权,也无法进入同步代码块进行执行。

示例代码段:

public void run() {      
        while(true){
            synchronized(this){
                if(ticket>0){
                    try{
                        //令线程短暂休眠
                       Thread.sleep(10);    
                    }catch(Exception e){}
                    System.out.println(Thread.currentThread().getName()+"当前售出票号:"+ticket--);
                }
            }           
        }
    }

4.多线程同步方法

格式:在普通方法前面添加synchronized关键字(此时同步锁是this)

示例代码段:

public synchronized void sale(){
        if(ticket>0){
            try{
                //令线程短暂休眠
               Thread.sleep(10);    
            }catch(Exception e){}
            System.out.println(Thread.currentThread().getName()+"当前售出票号:"+ticket--);
        }
    }

5.进行同步的前提及弊端

前提:

  • 程序必须要有两个或两个以上的线程
  • 必须是多个线程使用同一个锁(尤其体现在同步方法与同步代码块中,因此将同步代码块的锁改为this)

弊端:
- 多个线程需要判断锁,会消耗更多系统资源

6.分析多线程安全问题的方法:

  • 明确哪些代码是多线程运行代码(run中的代码及包含的方法)
  • 明确哪些是共享数据
  • 明确多线程运行代码中哪些语句是操作共享数据的

7.静态同步方法

说明:
如果同步方法被静态修饰后,使用的锁是该方法所在类的字节码文件对象[类名.class获取]
分析:
静态方法进入内存时,内存中没有本类的实例对象。但是有该类对应的字节码文件对象。
通过类名.class获取 ,该对象的类型是Class

Java线程及线程池入门(使用篇) Java线程及线程池的基本使用(入门篇) 阅读详情

相关推荐

Java 多线程编程:从基础到实战!

多线程编程是 Java 中的一个核心概念,它允许多个线程同时执行任务,从而提高程序的效率和响应性。在现代应用程序中,多线程编程无处不在,尤其是在处理高并发任务时。今天,我们将从基础到实战深入讲解 Java 的多线程编程,帮助你更好地理解和应用它。

喵手的博客 1118

Java SE多线程初接触(笔记整理)

多线程 1.1什么是线程?什么是进程? 进程是一个应用程序(1个进程是一个软件)。 线程是一个进程中的执行场景/执行单元。 一个进程可以启动多个线程。 1.2Java的线程原理 对于java程序来说,当在DOS命令窗口中输入: java HelloWorld 回车之后。 会先启动JVM,而JVM就是一个进程。 JVM再启动一个主线程调用main方法。 同时再启动一个垃圾回收线程负责看护,回收垃圾。 最起码,现在的java程序中至少有两个线程并发, 一个是垃圾回收线程,一个是执行main方法的主线程。 1

qq_47201748的博客 228

Java零基础之多线程篇:线程的多种创建方式

众所周知,多线程是现代计算机应用程序设计中的重要概念之一,尤其是在项目开发中,经常有场景会被使用到。其实它非常容易理解,它允许程序同时执行多个任务,从而提高了系统的资源利用率和响应速度。在本文中,我们将深入研究多线程的概念、本质、作用以及多种创建方式,并通过具体的Java代码测试用例来加深对多线程的理解。本文通过对多线程的概念进行介绍,我会解释多线程在现代计算机应用程序中的作用和优势。然后,我们比较了使用Runnable接口和Thread类来创建线程的两种方式,并分析了它们之间的区别。

喵手的博客 1025

Java线程 初次接触

进程:计算机执行的单元块,一个进程有多个线程。 线程:计算机最小执行的单元块 实现线程的两种方法:继承,重写 01-继承实现 public class Runa { public static void main(String[] args) { /*返回当前进程对象的方法*/ System.out.println(Thread.currentT...

你的调料包 185

Java零基础之多线程篇:线程生命周期

在并发编程中,多线程是一种非常重要的技术手段,理论知识及线程创建我已经在上一章节讲过了,本章我们就不再赘述。我们都知道Java作为一种广泛应用的开发语言,提供了丰富的多线程编程支持。了解并掌握Java多线程的生命周期对于编写高效且可靠的多线程程序至关重要。所以在本文中,我将介绍Java多线程的生命周期,包括线程状态的转换和对应的方法调用,作为新一期的内容进行讲解,这也是为了帮助大家学习上能够循序渐进。

喵手的博客 1255

Java零基础之多线程篇:线程控制

在计算机科学中,多线程是现代操作系统和应用程序的关键概念之一。通过使用多线程,可以同时执行多个任务,提高程序的运行效率。在Java开发语言中,多线程的概念被广泛应用,并且Java提供了丰富的多线程控制机制,使得开发人员能够更好地控制线程的行为。本文将介绍Java多线程中的线程控制相关内容,包括线程的创建和启动、线程的睡眠和唤醒、线程的等待和通知等方面。通过掌握这些线程控制技术,我们可以更加灵活地处理多线程程序中的并发问题。

喵手的博客 907

【多线程与高并发】- 线程基础与状态

多线程也是一项比较重要的内容,虽然CRUD不太会接触到,但是,在一些相关场景可能会有某些问题是由于线程导致的。简单理解就是一个进程中包含了许多个线程。

qq_43843951的博客 21万+

Java零基础之多线程篇:多线程最佳实践

在计算机科学领域,多线程是一种重要的编程概念。它允许程序同时执行多个任务,提高了程序的并发性和响应性。对于Java开发者而言,了解和掌握多线程编程是非常重要的一项技能。本文将从零基础开始介绍Java多线程的概念和用法,帮助读者理解多线程的原理和实践技巧。我们将深入探讨多线程的最佳实践,包括源代码解析、应用场景案例、优缺点分析和具体的Java代码测试用例。本文将带领读者逐步学习Java多线程编程的基础知识和高级概念。我们将通过详细的源代码解析和实际应用场景案例,帮助读者理解多线程的内部工作原理和使用技巧。

喵手的博客 2271

Java多线程基础知识

这是我再次学习多线程知识的一个总结,对于刚刚接触的学习者是比较友好易懂的,便于快速的理解和掌握。

gldzzznb的博客 3544

多线程基础:从线程创建到生命周期管理,Java线程的全方位解析!

在现代计算机程序中,多线程技术已经成为了必不可少的一部分。多线程能够让程序并发执行,提升程序的响应能力和处理效率。在 Java 中,线程管理是一项非常重要的技能,掌握它可以让你编写高效的程序。无论是GUI应用,还是需要高性能计算的后台程序,多线程都能发挥巨大的作用。今天,我们将深入探讨 Java 中的线程相关知识,重点讲解线程的概念、生命周期、创建方式、启动和停止机制,以及线程优先级、守护线程和线程组的使用。了解这些基础知识后,你将能在多线程编程中更加得心应手。

喵手的博客 847

Qt for Android:基于libusb实现CH340x串口通信的高效开发方案

本文详细介绍了在Qt for Android环境下,基于libusb实现CH340x串口通信的高效开发方案。通过绕过Android高版本系统的权限限制,利用libusb+JNI技术实现稳定通信,适用于工业手持终端等场景。文章涵盖环境搭建、核心实现、常见问题解决方案及性能调优经验,帮助开发者快速掌握这一关键技术。

weixin_42715608的博客 428

Java多线程基础

如果实际应用场景多次进行进程的申请毫无疑问那将会是很大的开销,特别是在Java中每次创建进程都要创建一个JVM虚拟机,因此为减少此开销轻量级进程也就是线程应运而生。多个线程通过共享一份给进程分配的资源从而优化了进程开辟销毁的开销,一般一个进程内一定有一个线程而资源分配就是在第一个线程创建时,而这样第二个第三个线程的创建就不再需要重复申请空间了,这些线程可能在同一份资源中各取所需也可能还需要额外申请资源也有一定的资源是公共的,但是并不是所有的线程都可以共享一份资源,这些可以共享一份资源的线程称为一个线程组。

startshining_ys的博客 937

软件项目成本控制实战:从COCOMO模型到挣值分析的5个关键步骤

本文详细介绍了软件项目成本控制的5个关键步骤,从COCOMO模型估算到挣值分析预警,帮助中小型团队精准管理预算。通过简化COCOMO II的有机模式、动态建立成本基准、轻量化挣值分析等方法,项目经理可以有效应对预算超支和进度延误问题,提升项目成功率。

weixin_30733003的博客 228

Java基础之线程深入接触

所谓死锁,是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

CodingEnding的博客 775

ArcGIS基础实战:面数据拓扑创建和错误修改全流程

通过下图的操作我们可以发现,图层的【Shape_Length】和【Shape_Area】字段的数值都发生了改变,表明两个图层重叠的那一部分图斑合并到另一个图班上,其面积会减小、长度会变大(自己重新计算一下也可以得到此验证结果的)。如图【拓扑实验结果】文件夹里右键,新建【文件地理数据库】,并进行命名为【xx拓扑检查】备注:养成良好的命名习惯。然后在【xx拓扑检查】下右键打开【新建要素数据集】,并对数据集进行命名为【XX拓扑】,然后进行下一步设置。在【KK拓扑】数据集上右键,新建【拓扑】。

yuanYW7556的博客 1万+

Hermes Agent vs OpenClaw:2026 年开源 AI Agent 框架深度对比

两款 2026 年最受关注的开源 AI Agent 框架,一个主打「自进化」,一个聚焦「网关路由」——它们究竟有何不同?本文将从架构原理、核心机制、使用方式到适用场景,为你全面拆解。无论你是 AI 研究者、开发者,还是想用 AI 提升工作效率的个人用户,这篇文章都将帮助你做出最适合的选择

程序猿_三产 3761

jmeter初接触-java请求&参数设置

jmeter

weilan100的专栏 1988

Spring Boot应用Docker化实战:从Dockerfile编写到镜像推送完整流程

本文详细介绍了将Spring Boot应用Docker化的完整实战流程。从环境准备、项目审视,到编写高效且安全的Dockerfile,重点讲解了多阶段构建、镜像层优化、Spring Boot分层JAR等核心技巧,并涵盖了镜像构建、验证、调试以及最终推送至仓库并集成CI/CD的最佳实践,帮助开发者构建生产级Docker镜像。

butter的博客 1024

菜鸟线程第一弹——初接触~

本菜鸟最近搞程序时,遇到了一个java编写延时函数的问题。大家可能都知道,延时函数只需要用到Thread.delay()就可以轻松搞定了,但是俺当时懵懂状态,因为以前做过一个定时器,所以想着是否可以用定时取代延时的功能呢? 首先,俺创建了一个Timer的对象:Timer timer=new Timer(); 然后,在类中建立了一个timerTask的类用于实现TimerTask接口;并重写了其...

stopit的专栏 151

ESP32天线阵列实现Wi-Fi空间成像与无直视定位

Wi-Fi信道状态信息(CSI)是OFDM系统中表征多径传播特性的基础物理层参数,其复数值包含幅度与相位,可反映无线环境的空间特征。基于CSI的射频感知技术,通过提取子载波级信道响应,结合阵列信号处理,实现到达角(AoA)估计与深度映射,本质是将通信链路重构为空间域传感器。该技术无需专用雷达硬件,具备低成本、被动式、隐私友好等工程优势,在室内定位、行为识别、仓储导航等场景具有广泛落地价值。本文聚焦ESP32平台,详解多芯片相位同步、CSI零拷贝采集、嵌入式MUSIC算法及信道图谱轻量化部署等关键实现。

weixin_30632267的博客 237

汽车UDS诊断之诊断会话控制服务(0x10)深度剖析

DiagnosticSessionControl就是诊断会话控制。 请求消息定义 A_Data类型 参数名称 Cvt 字节值 助记符 #1 诊断会话控制请求SID M 0x10 DSC #2 子功能=[诊断会话类型] M 0x00-0xFF LEV_DS_ ...

心骗小白话的博客 7421

多线程处理同一批数据_Java 多线程基础(一)

简介在接触多线程之前,在我们程序中在任意时刻都只能执行一个步骤,称之为单线程。在单线程开发的程序中所有的程序路径都是顺序执行的,前面的必须先执行,后面的才会执行。单线程的优点也很明显,相对于多线程来说更加稳定、扩展性更强、程序开发相对比较容易。但是由于每次都要等上一个任务执行完成后才能开始新的任务,导致其效率比多线程低,甚至有时候应用程序会出现假死的现象。使用多线程有利于充分发挥多处理器...

weixin_39551554的博客 1833

KEPServerEX 6 之 EX 6.11.718.0 发布说明

KEPServerEX 6.11.718.0 发布说明

-雲飛兄-博客 2882

线程池的初次接触

这篇关于线程池的文章写的不完整,点击下方链接查看我的另一篇线程池文章,帮你拿下线程池! https://blog.youkuaiyun.com/hgelin/article/details/100034454 2.线程池(juc包下)-面试重点 1)使用线程池的优点如下: (1)降低资源的消耗:通过重复利用已创建的线程降低线程创建与销毁带来的消耗。 ...

hgelin的博客 297

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java开启子线程的两种方式_【Java】基础31:创建线程的两种方式

线程的创建有两种方式,昨天学习过其中的一种:创建一个类,继承自Java里的Thread类,并重写run方法。最后再创建自定义线程的对象,并调用start方法,这样就启动一个线程了。那么Thread到底是个什么东西呢?一、Thread类在Java里面线程就是一个类,就叫Thread,无论是哪种创建方式,都是离不开它的,看看它有哪些常用方法:①创建一个线程对象。其中可以给线程初始化赋值名字,若是没有初...

weixin_33954874的博客 1889

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java多线程避免死锁,java多线程避免死锁 java多线程基础

????????本文主要讲java多线程的一些入门知识,包括线程的创建、调度、优先级、等待、休眠、中断及守护线程等...,在讲之前让我们先建立一个“数据字典”以简单了解多线程中出现的一些名词。??????????进程:进程是系统进行资源分配和调度的基本单位,是操作系统结构的基础。可以简单的理解为运行中的应用程序。????????多进程:允许计算机“同时”运行多个进程(应用程序)以提高CPU的利用率...

weixin_36480510的博客 263

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

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

上一篇: Java基础之异常处理初接触
下一篇: Java知识点之单例设计模式
CodingEnding
博客等级 码龄11年 86粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值