JAVAThread 多线程学习

Java多线程基础-4:详解Thread类及其基本用法 万字详解Java多线程编程类Thread及其基本用法。 阅读详情

开始第二遍学习java了,发现有好多的知识点在之前学习的时候是不了解的。在java多线程的板块中,学到了除了继承Thread 实现runnable接口以外 还学到了第三种的基于线程池的实现callable接口的线程方式。感觉java真实博大精深。对java线程的笔记总结:

java线程

java程序由一条线程执行完毕 称为单线程程序
java程序由多条程序执行完毕 称为多线程程序

1:多线程 
(1)多线程:一个应用程序有多条执行路径 进程:正在执行的应用程序 线程:进程的执行单元,执行路径 单线程:一个应用程序只有一条执行路径 多线程:一个应用程序有多条执行路径

    多进程的意义?   
        提高CPU的使用率
    多线程的意义?
        提高应用程序的使用率
(2)Java程序的运行原理及JVM的启动是多线程的吗?
    A:Java命令去启动JVM,JVM会启动一个进程,该进程会启动一个主线程。
    B:JVM的启动是多线程的,因为它最低有两个线程启动了,主线程和垃圾回收线程。
(3)多线程的实现方案
A:继承Thread类
B:实现Runnable接口
* 两种方式的比较   

(4)线程的调度和优先级问题
A:线程的调度
  • a:分时调度
  • b:抢占式调度 (Java采用的是该调度方式)
  • B:获取和设置线程优先级
        a:默认是5
        b:范围是1-10
    
(5)线程的控制(常见方法)
A:休眠线程
API方法:

线程睡眠毫秒数

  • public static void sleep(long millis)
B:加入线程
API方法

join:等待线程终止,等待线程执行完毕后其它的线程才可以运行

  • public final void join();
C:礼让线程
API方法

一定程度上让多个线程的执行和谐,不靠谱

  • public static void yield()
D:后台线程
API方法
  • public final void setDaemon(boolean on) 
    当正在运行的线程都是守护线程时,java虚拟机退出,该方法必须在线程启动之前调用 
    标记为守护线程后,线程会依附于某个线程,不会独立的run
E:终止线程(掌握)
API方法
  • public final void stop() 让线程停止,已过时

  • public void interrupt() 终止线程,并且抛出InterruptedException异常,并会执行后续的代码

线程的生命周期(参照 线程生命周期图解.bmp)

A:新建

创建线程对象的过程

B:就绪

有执行的条件和资格,没有执行权

c:运行

有运行的资格,有执行权

D:阻塞

没有执行资格,没有执行权

E:死亡

线程对象变成垃圾,等待被回收

(7)电影院卖票程序的实现
    A:继承Thread类
    B:实现Runnable接口
(8)电影院卖票程序出问题
    A:为了更符合真实的场景,加入了休眠100毫秒。
    B:卖票问题
        a:同票多次
        b:负数票
(9)多线程安全问题的原因(也是我们以后判断一个程序是否有线程安全问题的依据)
    A:是否有多线程环境
    B:是否有共享数据
    C:是否有多条语句操作共享数据
(10)同步解决线程安全问题
A:同步代码块

synchronized(对象) { 
需要被同步的代码; 
}

这里的锁对象可以是任意对象。

B:同步方法

把同步加在方法上。

这里的锁对象是this

C:静态同步方法

把同步加在方法上。

这里的锁对象是当前类的字节码文件对象(反射再讲字节码文件对象)

(11)回顾以前的线程安全的类
  • A:StringBuffer
  • B:Vector
  • C:Hashtable
  • D:如何把一个线程不安全的集合类变成一个线程安全的集合类用Collections工具类的方法即可。
相关知识点
(1)JDK5以后的针对线程的锁定操作和释放操作
Lock锁
    // 定义锁对象
    private Lock lock = new ReentrantLock();

    @Override
    public void run() {
        while (true) {
            try {
                // 加锁
                lock.lock();
                if (tickets > 0) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()
                            + "正在出售第" + (tickets--) + "张票");
                }
            } finally {
                // 释放锁
                lock.unlock();
            }
        }
    }
(2)死锁问题的描述和代码体现
  • 是指两个或者两个以上的线程在执行的过程中,因争夺资源产一种互相等待现象
  • 同步代码块的嵌套案例
    @Override
public void run() {
    // 死锁代码
    if (flag) {
        // 同步嵌套
        synchronized (MyLock.objA) {
            System.out.println("if obja");
            synchronized (MyLock.objB) {
                System.out.println("if objb");
            }
        }
    } else {
        synchronized (MyLock.objB) {
            System.out.println("else objb");
            synchronized (MyLock.objA) {
                System.out.println("else obja");

            }
        }
    }
}
(3)生产者和消费者多线程体现(线程间通信问题)
    以学生作为资源来实现的

    资源类:Student
    设置数据类:SetThread(生产者)
    获取数据类:GetThread(消费者)
    测试类:StudentDemo

    代码:
        A:最基本的版本,只有一个数据。
        B:改进版本,给出了不同的数据,并加入了同步机制
        C:等待唤醒机制改进该程序,让数据能够实现依次的出现
            wait() 线程等待后立即释放所持有的锁,被唤醒后在等待的位置继续执行
            notify() 唤醒并不代表立马可以执行 线程会转为就绪状态 等待下一次执行
            notifyAll() (多生产多消费)   
  • 为什么定义在Object中?
    • 这些方法的调用通过锁对象调用,而我们使用的锁可能是任意锁对象。所以,这些方法必须定义在Object类中 =* 等待唤醒机制的代码优化。把数据及操作都写在了资源类中
(4)线程组
  • Java中使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制。 默认情况下,所有的线程都属于主线程组(main组)。 
    返回该线程所属的线程组
  • public final ThreadGroup getThreadGroup() 
    我们也可以给线程设置分组
  • Thread(ThreadGroup group, Runnable target, String name)
    新建线程组代码:

        // ThreadGroup(String name)
        ThreadGroup tg = new ThreadGroup("这是一个新的组");
    
        MyRunnable my = new MyRunnable();
        // Thread(ThreadGroup group, Runnable target, String name)
        Thread t1 = new Thread(tg, my, "林青霞");
        Thread t2 = new Thread(tg, my, "刘意");
    
        System.out.println(t1.getThreadGroup().getName());
        System.out.println(t2.getThreadGroup().getName());
    
        //通过组名称设置后台线程,表示该组的线程都是后台线程
        tg.setDaemon(true);
    
(5)线程池

程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互。而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池。

  • 线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用。
  • 在JDK5之前,我们必须手动实现自己的线程池,从JDK5开始,Java内置支持线程池
  • JDK5新增了一个Executors工厂类来产生线程池,有如下几个方法

public static ExecutorService newCachedThreadPool()

创建一个具有缓存功能的线程池
缓存:百度浏览过的信息再次访问   

public static ExecutorService newFixedThreadPool(int nThreads)

创建一个可重用的,具有固定线程数的线程池

public static ExecutorService newSingleThreadExecutor()

创建一个只有单线程的线程池,相当于上个方法的参数是1   

protected void shutdown() 
顺序关闭线程池中的线程 这些方法的返回值是ExecutorService对象,该对象表示一个线程池,可以执行Runnable对象或者Callable对象代表的线程。它提供了如下方法 
Future<?> submit(Runnable task) 
Future submit(Callable task)

(6)多线程实现的第三种方案

实现Callable接口 步骤和刚才演示线程池执行Runnable对象的差不多。 但是还可以更好玩一些,求和案例演示 好处: 可以有返回值 可以抛出异常 弊端: 代码比较复杂,所以一般不用

匿名内部类方式使用多线程

new Thread(){代码…}.start(); New Thread(new Runnable(){代码…}).start();

多线程的应用
定时器的使用
描述:
  • 定时器是一个应用十分广泛的线程工具,可用于调度多个定时任务以后台线程的方式执行。在Java中,可以通过Timer和TimerTask类来实现定义调度的功能

  • Timer 一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。

public Timer() 
public void schedule(TimerTask task, long delay) 
public void schedule(TimerTask task,long delay,long period) 
* TimerTask 任务类用于为Timer指定任务 public abstract void run() 
public boolean cancel() 
* 开发中 
Quartz是一个完全由java编写的开源调度框架。

线程的生命周期转换图:


TOPSIS与熵权法实战:从数学建模到Python实现(附国赛案例分析) 本文详细解析了TOPSIS(逼近理想解排序法)与熵权法在数学建模中的协同应用,并通过Python代码实现完整流程。文章以国赛案例为背景,从指标正向化、数据标准化、熵权法计算客观权重,到TOPSIS综合排序,手把手指导如何解决多指标决策问题,为数据分析与建模提供了一套可复用的实战工具箱。 阅读详情

相关推荐

基于CLICKHOUSE的数据仓库分层规范

接入层。

zjyy1987的博客 769

Java多线程(Thread)

/继承Thread类的启动方法 new Thread(new MyThread2()) . start();//实现Runnable接口的启动方法 FutureTask < Integer > futureTask = new FutureTask(new MyThread3());//实现Callable接口的启动方法 new Thread(futureTask) . start();try {

m0_65137927的博客 428

谷歌账号国家或地区设置修改全攻略:条件、流程与避坑指南

谷歌账号的国家或地区设置与付款资料、账号历史行为及登录环境强绑定,修改时需满足特定条件。其原理在于地区作为索引键,关联内容库、货币结算和风控策略。正确切换可解决内容推荐错乱、付款失败等问题,适用于搬家、订阅区域限定服务等场景。操作前需在目标地区创建付款资料、清空余额并取消订阅,且一年仅能修改一次。本文详解从准备到验证的完整流程,并揭示官方文档未提及的实操陷阱,助你安全完成地区切换。

weixin_42521558的博客 2264

Java 多线程2——Thread类常见属性 + 常见方法 + 线程状态

多线程编程是开发项目中,要用到的,多线程编程是把双刃剑,即可以提高效率,也会带来不少线程安全问题,学会多线程基础,为后续解决线程安全问题做铺垫!!!

The_emperoor_man的博客 1959

3D模型文件格式全解析:从STL到glTF,10种主流格式与转换实战指南

在三维数字内容创作与工程制造领域,3D模型文件格式是数据交换与协作的基石。其核心原理在于以不同的数据结构(如三角网格、NURBS曲面、边界表示等)对三维物体的几何、外观及场景信息进行编码。理解这些格式的技术特性,对于保障数据完整性、提升工作流效率具有关键价值,广泛应用于3D打印、游戏开发、影视动画及工业设计等场景。例如,面向增材制造的STL格式以其极简的三角面片结构成为行业通用语,而支持丰富材质与动画的FBX格式则在影视游戏管线中扮演核心角色。本文聚焦于STL、OBJ、FBX、3MF、STEP等10种主流格

weixin_28520495的博客 354

别再为reg2icg的setup违例头疼了!手把手教你用ICC2/Innovus这3招搞定(附实战数据对比)

本文详细介绍了在ICC2/Innovus中解决reg2icg的setup违例的三种高效方法,包括早期时钟树预估、精准控制时钟延迟与门控检查以及ICG专用优化选项组合。通过实战数据对比,展示了不同策略的效果差异,帮助工程师快速优化时序路径,提升芯片性能。

weixin_42569329的博客 405

Java 多线程

Java多线程详解

ᶻᶻᶻ 枕星河的博客 1648

基于HetConv与Dual策略的YOLOv8轻量化设计-CSPHet结构的优化与实现

在计算机视觉中,YOLOv8作为目标检测领域的最新版本,通过引入多种改进来提升检测精度和速度。然而,提升精度和保持实时性能往往需要更多参数与计算量。本文提出一种结合Dual思想与HetConv的新型轻量化结构,称为CSPHet。CSPHet能够在保持YOLOv8检测精度的基础上有效减少约70万参数量,实现模型的轻量化和速度的提升。HetConv(Heterogeneous Convolution)是一种混合卷积技术,通过同时使用1x1、3x3等不同大小的卷积核,来捕捉不同尺度的特征。

博客 1324

Java中的多线程(Thread)(一)概念篇

学习目标 知识点 要求 多线程介绍 了解 线程的创建 掌握 线程的使用 掌握 线程的优先级 掌握 守护线程 掌握 线程同步 掌握 线程并发协作 掌握 一、 多线程介绍 多线程的基本概..

weixin_44918667的博客 2474

CKS-CN考试之路----04

根据上面信息我们知道,这个pod运行在default命名空间下,pod名字为cpu-77cd5ddcbf-bvb8w。可以从/etc/falco/falco_rules.yaml中获得相关内容,大概在文件的460行左右.编辑/etc/falco/falco_rules.local.yaml。7c688a8bfd69即是我们想要获得的docker id。将行为不当 Pod 的 Deployment 缩放为零副本。根据我们刚才定义的rule生成报告。访问/dev/mem 的 Pod。那么如果考试记不住怎么办?

Q先生 602

基于Simulink的转向控制系统仿真建模示例

本文完成了基于 Simulink 的 EPS 转向控制系统仿真,实现了:✅掌握 EPS 助力控制基本原理✅构建车速敏感的可变助力策略✅在 Simulink 中验证低速轻便、高速沉稳的手感✅达成“安全、舒适、高效”的现代转向系统。

xiaoheshang_123的博客 86

Java面向对象程序开发——多线程开发,2024年最新为什么阿里的程序员成长如此之快

线程(thread)是一个程序内部的一条执行路径。我们之前启动程序执行后,main方法的执行其实就是一条单独的执行路径。程序中如果只有一条执行路径,那么这个程序就是单线程的程序。多线程是指从软硬件上实现多条执行流程的技术或者说多线程是指多个可以同时并发运行的程序消息通信、淘宝、京东系统等都离不开多线程技术。

2401_84164527的博客 973

ICC2(一)import design —— tluplus

itf转tluplus相关命令 TLUPlus是存储RC系数的二进制表格式。 TLUPlus模型通过包括宽度,空间,密度和温度对电阻系数的影响,可以估算RC计算net delay。 1.2 产生TLUplus的方法 Itf文件转TLUplus的命令: grdgenxo -itf2TLUPlus -i xx.itf-o xx.tlu+ itf: interconnect technology format file 含每层的厚度,面积等参数 itf同样可以转nxtgrd格式文...

m0_61544122的博客 5483

JavaThread 01 多线程详解

1.1 多线程详解 平时打游戏,为什么那么多人可以一块儿 打呢?为什么我跟你聊天,你也能跟我聊天呢。 线程简介 线程实现(重点) 线程状态 线程同步(重点) 线程通讯问题 高级主题

小哞^同^学的技术博客 150

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

JavaThread线程

两种方法后期使用率上,第二种相对更高一些1、避免了单一继承的局限性,因为java是单继承的 ,继承了Thread类,就不能继承其他类2、更适合多线程共享同一份资源的场景。

2303_77543831的博客 1981

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

JavaThread

Java多线程 1、线程介绍 2、线程实现*(线程不一定执行看CPU调度安排!) 三中创建方式 (1):继承Thread类(重点,实现了Runnable接口) //继承Thread类,重写run()方法 ,调用start开启线程 public class ThreadTest extends Thread { @Override public void run() { //run方法线程体 for (int i=0;i<20;i++){

Reckless_hrl的博客 319

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

JavaThread学习

一:Java多线程常见问题: 1、为什么使用多线程? 首先多线程可以增加在多核CPU条件下的处理能力。 其次能够快速响应用户的GUI请求。 然后在阻塞I/O的情况下可以异步处理。 这个接受抬扛,具体的可以看应用场景,但是使用多线程是趋势。 2、启动线程的两种方式区别,联系,以及使用的趋势? 启动线程可以通过继承Threa...

weixin_33720078的博客 95

理解多线程/写一个多线程应用程序

问题描述 理解多线程,写一个多线程应用程序,要求能在用户级实现线程的调度,如启动、挂起、恢复、停止,可以用windows thread、pthread、java thread实现。 理解多线程 Java Thread实现 C Thread实现 ...

One of thre_tigers的博客 1150

javaThread技术--学习笔记

一:创建线程的方式:        public class TraditionalThread { public static void main(String[] args) { Thread thread1 = new Thread() { public void run() { while (true) { System.out.println("线程--2

kang_940516的专栏 604

Java多线程学习心得

1、Java中多线程类通过继承Thread类或者实现Runnable接口来实现。调用start()方法启动线程。多线程的调度是非决定性的。所以每次运行都会有不同的结果; 2、setPriority、setDameon和yield操作只是相对的改变线程获得运行机会的大小,并不能严格控制线程; 3、线程A调用线程B的join方法,A挂起直到B线程结束才被唤醒; 4、非守护线程都结束后,守护线程也随之...

samueli的专栏 193

JavaThread、Runnable、Callable、线程池的使用

一、继承Thread类 public class TestThread1 extends Thread { @Override public void run() { for(int i=1; i<=100; i++) { System.out.println("线程1的" + i); try { sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } }

m0_49499183的博客 2210

javaThread学习(chapter1—线程的创建)

javaThread学习(chapter1—线程的创建)一:创建多线程1:继承Thread,重写父类的run 方法public class MyThread extends Thread{ @Override public void run() { super.run(); System.out.println("start run"); } }

cocoooooa的专栏 576

java线程 买东西例子_java Thread 多线程 经典仓储--生产--消费实例

这两天,要做个东西,用到多线程,温习一下,写了一个经典多线程例题,仓储--生产--消费的例子,希望能对大家有点帮助.实现原理:我们去建立一个仓库(Storage),仓库中有个入库最大值,当达到这个最大值的时候,生产(Product)就停止生产.消费者就会去消费,消费之前会查询仓库里的存货量,当存货量等于0的时候,就让其停止消费,这时候,开始生产,就这样的一个循环过程.注意:这都是继承Thread进...

weixin_39986543的博客 338

JavaThread 03 Runnable&&初识并发问题

1.4 Runnable&&初识并发问题 1.4.1 实现 Runnable 接口 其实 Thread 这个类 就是 Runnable 接口的 实现,所以我们 建议 直接 用 Runnable 接口,而不是 去用 二次封装的 Thread 是有道理的。 需要注意的是,Runnable 接口 在 开启线程之前,需要 建立 一个 Thread 对象,作为 代理,用来 开启 线程! package www.muquanyu.lesson01; public class RunnableDe

小哞^同^学的技术博客 211

JavaThread 02 继承 Thread 类 && 网图下载

1.2 继承 Thread 类 1.2.1 线程创建 当进程创建的时候,会创建一个 主线程(main方法),还有一个就是 JVM 特有的 GC(垃圾回收)线程。 main函数 叫 “用户线程/主线程” 是自己写的! GC 线程是JVM给我们的,也被称为 “守护线程”! 一共有三种 线程的创建方式。 Runnable 接口 是目前的主流(也是重点) Callable 接口 可能是 以后的 主流(但现在只做了解) 1.2.2 Thread 自定义线程类继承 Thread 类 重写 run()

小哞^同^学的技术博客 210

java多线程与锁

Java多线程与并发 线程与进程的区别 java线程的几种状态: 线程状态中有几个需要注意的点: 就绪态与阻塞态:就绪态代表所有的执行条件都满足(比如i/o、锁)只是等着CPU来调度,而阻塞态戴白不具备一些条件,比如锁或打印机等待等。阻塞的方法有以下四种:sleep()\wait()\join()\io等待 就绪态就是线程已经可以运行但不一定运行的状态 新生态Thread t = new Thread();代表已经有了自己的空间,与就绪态的区别就是是否t,start() 死亡状态指的是,线程体.

qq_33556348的博客 509
上一篇: android 中处理崩溃异常并重启程序
下一篇: JAVA设计原则与设计模式
ProbuINg
博客等级 码龄14年 10粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值