Java并发 -- 线程生命周期

《数据分析岗笔试高频题:字节常用的SQL与AB测试考题解析》 • 核心考点:用RANK()/DENSE_RANK()/ROW_NUMBER()排序,SUM() OVER()计算累积值。◦ 用公式n=2*(Zα/2+Zβ)^2*σ²/δ²,取α=0.05,β=0.2,计算得每组需260人;◦ 关注字节技术公众号“字节跳动数据团队”,学习真实AB测试案例(如“推荐算法优化实验”)。• 题型分布:SQL编程题(40%)、AB测试方案设计(30%)、数据洞察题(30%);◦ 牛客网“字节跳动SQL真题”(如“统计用户7日留存”“广告投放ROI计算”)。 阅读详情

1. 初始状态

  • 线程已经被创建,但还不允许分配CPU执行
  • 该状态属于 编程语言 所特有,仅仅在编程语言层面被创建,在操作系统层面,真正的线程还没有创建
    2. 可运行状态
    线程可以分配CPU执行,该状态下真正的操作系统线程已经被创建
    3. 运行状态
  • 当有空闲的CPU时,操作系统会将其分配给处于 可运行状态 的线程,被分配到CPU的线程的状态就转换为 运行状态
  1. 休眠状态
  • 处于 运行状态 的线程如果调用一个 阻塞的API 或者 等待某个事件 ,那么线程状态就会切换为 休眠状态
  • 切换为休眠状态的同时会 释放CPU使用权 , 处于休眠状态的线程永远没有机会获得CPU使用权
  • 当等待的事件出现后,线程就会从休眠状态切换到 可运行状态
  1. 终止状态
  • 线程 执行完 或者 出现异常 就会进入 终止状态 ,处于终止状态的线程不会切换到其它状态
  • 进入终止状态意味着线程生命周期的 结束

简化合并

  1. 通用的线程生命周期里的5种状态在不同的编程语言会有 简化合并
  2. Java把 可运行状态 和 运行状态 合并了
    这两个状态对操作系统调度层是有价值的,但 JVM把线程调度交给了操作系统处理 ,JVM并不关心这两个状态
  3. JVM同时也细化了 休眠状态

Java线程的生命周期

  1. Java线程的状态可以参照代码 java.lang.Thread.State
  2. 在操作系统层,Java线程状态的 BLOCKED、WAITING、TIMED_WAITING 都是 休眠状态 ,永远无法获得CPU的使用权
  3. BLOCKED、WAITING、TIMED_WAITING可以理解为导致线程 进入休眠状态 的三个 原因

RUNNABLE + BLOCKED

  1. 唯一场景: 线程等待synchronized的隐式锁
  2. synchronized修饰的方法(代码块)在同一时刻只允许一个线程执行,其它线程只能等待( RUNNABLE -> BLOCKED )
  3. 当等待的线程获得synchronized隐式锁时, BLOCKED -> RUNNABLE

阻塞式API

  1. 在 操作系统 层面,操作系统线程调用 阻塞式API ,会转换到 休眠状态
  2. 在 JVM 层面,Java线程调用 阻塞式API ,Java线程的状态会 保持RUNNABLE
  • JVM层面并不关心操作系统调度相关的状态
  • 在JVM看来,等待 CPU使用权 (操作系统层面为 可执行状态 )和等待 IO (操作系统层面为 休眠状态 )没有区别
    • 都是在等待某个资源,所以都归入RUNNABLE状态

RUNNABLE + WAITING

  1. 获得synchronized隐式锁的线程,调用无参数的 Object.wait() 方法
  2. 调用无参数的 Thread.join() 方法,join是一种 线程同步 的方式
  • 有线程A,当线程B调用A.join()时,线程B会等待线程A执行完,线程B的状态切换: RUNNABLE -> WAITING
  • 当线程A执行完后,线程B的状态切换: WAITING -> RUNNABLE
  1. 调用 LockSupport.park() 方法, 当前线程会阻塞 ,线程状态切换: RUNNABLE -> WAITING
  • 调用 LockSupport.unpark(Thread thread) 方法可以唤醒 目标线程
  • 目标线程的状态切换: WAITING -> RUNNABLE

RUNNABLE + TIMED_WAITING

  1. 调用 带超时参数 的 Thread.sleep(long millis) 方法
  2. 获得synchronized隐式锁的线程,调用 带超时参数 的 Object.wait(long timeout) 方法
  3. 调用 带超时参数 的 Thread.join(long millis) 方法
  4. 调用 带超时参数 的 LockSupport.parkNanos(Object blocker, long nanos) 方法
  5. 调用 带超时参数 的 LockSupport.parkUntil(long deadline) 方法

##NEW + RUNNABLE

// 方式1
class MyThread extends Thread {
    @Override
    public void run() {
        super.run();
    }
}
Thread myThread = new MyThread();

// 方式2
class Runner implements Runnable {
    @Override
    public void run() {
        // task code
    }
}
Thread thread = new Thread(new Runner());
  1. Java刚创建出来的Thread对象就是处于NEW状态,创建Thread对象的两种方式:继承Thread + 实现Runnable
  2. NEW状态的线程, 不会被操作系统调度 ,所以不会执行,调用线程对象的start()方法: NEW -> RUNNABLE

RUNNABLE + TERMINATED

当线程 执行完 run()方法后,会自动切换到TERMINATED状态;在执行run()方法的过程中 抛出异常 ,也会导致线程终止

stop() + interrupt()

  1. stop()方法会 直接杀死线程 ,不给线程喘息的机会
  • 如果线程持有ReentrantLock锁,被stop()的线程 不会自动调用 ReentrantLock.unlock()去释放锁
  • 类似的方法还有suspend()和resume()
  1. interrupt()方法仅仅 通知线程 ,收到通知的线程可以选择 无视 这个通知,继续选择执行后续操作
  2. 被interrupt的线程,收到通知的两种方式: InterruptedException + 主动检测
  3. InterruptedException
  • 当线程A处于 WAITING 或 TIMED_WAITING 状态时,其它线程调用A.interrupt()方法时
    • 会使线程A返回 RUNNABLE 状态,同时线程A的代码会触发InterruptedException异常
    • Thread.sleep(long millis)、Thread.join()、Object.wait()的方法签名都有throw InterruptedException
  • 当线程A处于 RUNNABLE 状态时,并且阻塞在java.nio.channels.InterruptibleChannel上时
    • 如果其它线程调用A.interrupt()方法,线程A会触发java.nio.channels.ClosedByInterruptException
  • 当线程A处于 RUNNABLE 状态时,并且阻塞在java.nio.channels.Selector上时
    • 如果其它线程调用A.interrupt()方法,线程A会立即返回
  • 线程中断状态
    • 线程A抛出InterruptedException后,会 重置线程中断状态
  1. 主动检测
  • 当线程A处于 RUNNABLE 状态,并且 没有阻塞 在某个IO操作上,此时需要依赖线程A 主动检测 自己的中断状态
    • 如果其它线程调用A.interrupt()方法,那么线程A可以通过isInterrupted()方法来检测自己是否被中断了
Thread th = Thread.currentThread();
while (true) {
    if (th.isInterrupted()) {
        // 死循环,永远无法break
        break;
    }
    try {
        Thread.sleep(100);
    } catch (InterruptedException e) {
        // 抛出InterruptedException会重置线程中断状态,导致死循环
    }
}
ASPICE学习笔记 ASPICE的全称是Automotive SPICE。 阅读详情

相关推荐

带有验证码的爆破(包含Burp suite工具爆破)

关于含有验证码爆破的一些总结!

weixin_43960066的博客 8698

Java线程的6种状态及切换(透彻讲解)

Java中线程的状态分为6种。 1. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。 2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。 线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状...

潘建南的博客 27万+

AD元件库构建及维护之——DbLib公共元件库的使用教程

AD元件库构建及维护之——DbLib元件库的使用教程

qq_43105486的博客 2万+

并发编程基础

并发编程基础概念 计算机组成原理 现代计算机硬件原理图 冯·诺依曼计算机的特点 计算机由运算器、存储器、控制器、输入设备和输出设备五大部件组成 指令(程序)和数据以二进制不加区别地存储在存储器中 程序自动运行 运算器和控制器封装到一起,加上寄存器组和cpu内部总线构成中央处理器(CPU)。cpu的根本任务,就是执行指令,对计算机来说,都是0,1组成的序列,cpu从逻辑上可以划分为3个模块:控制单元、运算单元和存储单元。这三个部分由cpu总线连接起来。 cpu原理图 CPU的运行原理就是:控制单元在时

qq_43843037的博客 473

VSCode配置C/C++开发环境:从零安装MinGW-w64并运行第一个C程序

在Windows系统上搭建C语言开发环境时,很多初学者混淆编辑器、编译器与调试器的分工,导致配置过程屡屡受挫。理解VSCode作为轻量级编辑器的定位,以及MinGW-w64提供的gcc编译器在源码编译中的核心作用,是顺利完成环境配置的关键。环境变量的正确设置直接影响gcc命令能否全局调用,而C/C++插件则赋予编辑器语法高亮与智能提示能力。通过安装VSCode、配置MinGW-w64、安装插件、汉化界面并运行一个最简单的hello.c程序,就能系统掌握这套开源工具链的完整工作流。无论是用于课程学习、算法练习

weixin_42531923的博客 533

三、使用HM进行简单的视频隐写demo

三、使用HM进行简单的视频隐写前言一、实验环境二、实验思路三、实验过程3.1 提取原始载体3.2 使用LSB隐写算法进行隐写3.3 放回含密载体3.4 提取含密载体3.5 使用LSB提取算法进行比对四、碰到的问题以及解决思路4.1 块的结构体发生变化4.1.1 产生的原因4.1.2 解决方法4.2 一个有趣的现象4.2.1 产生的原因4.3 视频产生较大失真4.3.1 产生的原因4.3.2 解决方法五、总结 前言 在前两篇博客中介绍了基于HEVC/H.265视频编解码器的视频隐写的基本思路,本文将详细记录

杨酬勤的博客 1795

JVM致命错误日志(hs_err_pid.log)分析

当jvm出现致命错误时,会生成一个错误文件 hs_err_pid.log,其中包括了导致jvm crash的重要信息,可以通过分析该文件定位到导致crash的根源,从而改善以保证系统稳定。当出现crash时,该文件默认会生成到工作目录下,然而可以通过jvm参数指定生成路径(JDK6中引入):-XX:ErrorFile=./hs_err_pid<pid>.log该文件包含如下几类关键信息: 日志头文件

Viking的博客 2万+

硬件测试之—纹波测试为什么不要使用接地夹子

示波器为什么不推荐使用接地夹

qq_19294353的博客 2989

多线程——状态转换

多线程——状态转换   线程可以分为4个状态: New(新生), Runnable(可运行):为了方便分析,还可将其分为:Runnable与Running。 blocked(被阻塞), Dead(死亡)。     1,新生线程: 当你用new操作符创建一个线程时,例如用new Thread(r),线程还没有开始运行,此时线程处于新生状态;在线程运行之前,还有一些簿记工作要做。 ...

爱自立--专业博客 190

YOLOv11改进策略【卷积层】| CVPR 2024 可变形卷积 v4(DCNv4)无界权重提表达 + 线程合并降冗余,强化模型收敛速度

DCNv4(Deformable Convolution v4)是一种专为广泛视觉应用设计的高效算子,它对DCNv3进行了关键改进,有效解决了DCNv3存在的速度慢和表达能力受限等问题。

Limiiiing的博客 926

从业务角色到工作台:一步步创建 SAP Fiori Launchpad Space 与 Page

SAP S/4HANA Launchpad 配置优化指南:从业务角色出发构建高效工作台 本文针对S/4HANA项目中用户普遍反映的"入口难找"问题,提出基于Spaces和Pages的系统化解决方案。通过"以工作岗位为中心"的设计理念,将Launchpad信息架构重构为:一个业务角色对应一个Space,每个Space包含1-5个Page,Page内按任务划分2-5个Section,每个Section放置3-7个Tiles。文章详细阐述了从Business Role入手配

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 230

JVM致命错误日志(hs_err_pid.log)分析-例如Idea的java_error_in_idea64_xxx.log

当jvm出现致命错误时,会生成一个错误文件hs_err_pid<pid>.log,其中包括了导致jvm crash的重要信息,可以通过分析该文件定位到导致crash的根源,从而改善以保证系统稳定。当出现crash时,该文件默认会生成到工作目录下,然而可以通过jvm参数指定生成路径(JDK6中引入): -XX:ErrorFile=./hs_err_pid<pid>.log 该文件包含如下几类关键信息: 日志头文件 导致crash的线程信息 所有线程信息.

Tech My Life 6790

【系统架构设计师-2025上半年真题】综合知识-参考答案及详解(75题完全回忆版)

【系统架构设计师-2025上半年真题】案例分析-参考答案及部分详解

数据知道的博客 1万+

【Java并发编程】理解线程的生命周期

在三个月前学习JavaSE的时候,曾经写过有关Java多线程基础方面的博文: 【Java基础】线程实现方式 (线程基础) 【Java基础】线程同步机制 (线程基础) 【Java基础】等待唤醒机制 (线程基础) 【Java基础】线程池 (线程基础) 最近在强化深入理解Java并发编程。以后的博文都会有一定的深度的。上面的基础部分不会过于强调。 理解线程的生命周期是深入学习Java并发编程必备的认...

明月沉江春雾晓 3818

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java-并发与并行、线程的生命周期

Java-并发与并行、线程的生命周期

weixin_65049289的博客 442

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【Java实战】线程池 并发 并行 生命周期(详细解释)

进程中的线程是由CPU负责调度执行的,到CPU能同时处理线程的数量有限,为了保证全部线程都能往前执行,CPU会为系统的每个线程服务,由于CPU切换的速度很快,给我们的感觉是这些线程在同时执行,这就是并发。新任务提交时核心线程都在忙,任务队列也满了,并且还可以创建临时线程,此时才会创建。使用**Executor(线程池工具类)**调用方法返回不同特点的线程池对象。:当线程数超过核心线程数时,多余的空闲线程在终止前等待新任务的最长时间。核心线程和临时线程都在忙,任务队列也满了,新的任务过来会拒绝新的任务。

Hy_g_g_e_的博客 1342

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

java并发-线程生命周期

为是么需要线程 并发的发展历史 真空管和穿孔打卡 最早的计算机只能解决简单的数学运算问题,比如正弦、余弦等。运行方式:程序员首先把程序写到纸上,然后穿孔成卡片,再把卡片盒带入到专门的输入室。输入室会有专门的操作员将卡片的程序输入到计算机上。计算机运行完当前的任务以后,把计算结果从打印机上进行输出,操作员再把打印出来的结果送入到输出室,程序员就可以从输出室取到结果。然后,操作员再继续从已经送入到...

liulong1010的专栏 183

java 线程池 并发并行 线程的生命周期

java 线程池 补充知识 创建线程池 线程池执行Runnable任务 线程池执行Callable任务 线程池工具类(Executors)补充知识 并发 并行 线程的生命周期

weixin_43739821的博客 683

Java线程:并发/并行区别、线程生命周期、乐观锁/悲观锁

与之前不同的是,现在count是一个一个加的,即打印出的count是有序的,且能加到10000了,线程安全了。进程中的线程是由CPU负责调度执行的,但CPU能同时处理线程的数量有限,为了保证全部线程都能往前执行,一开始不上锁,认为是没有问题的,大家一起跑,等要出现线程安全问题的时候才开始控制。虽然代码出现了线程安全问题,但是最终的结果也是很接近我们想要的结果的,即只是偶尔发生了线程冲突。也就是线程从生到死的过程中,经历的各种状态及状态转换。需求:1变量,100个线程,每个线程对其加100次。

后端小白个人学习记录 424

Java多线程并发——并发知识库,4种线程创建方式,4种线程池,线程生命周期,终止线程4种方式

JAVA 并发知识库 JAVA 线程实现/创建方式 1、继承 Thread 类 Thread 类本质上是实现了 Runnable 接口的一个实例,代表一个线程的实例。启动线程的唯一方 法就是通过 Thread 类的 start()实例方法。start()方法是一个 native 方法,它将启动一个新线 程,并执行 run()方法。 public class MyThread ...

LMAKE_nbsp的博客 1144

Java 进程/线程 并发/并行 线程的生命周期

• 车间之间要沟通,必须通过大喇叭喊话(进程间通信,比如文件、网络)。• 比如边听音乐边回微信,其实是快速切换任务(听1秒歌,回1秒微信)。• 多个工人(线程)共享车间的水电(同一进程的内存)。• 等待 CPU 分配时间片(可能排队等CPU空闲)。• 每个车间(进程)有自己独立的水电(内存、资源)。• 比如线程需要获取一个锁,但锁被其他线程占用了。• 场景:一个人(单核 CPU)同时做多件事。• 场景:多个人(多核 CPU)同时做多件事。• 可能中途被其他任务打断(比如去接电话)。

m0_68001451的博客 360

Java进阶学习笔记94——并发、并行、线程的生命周期

Java进阶学习笔记

CCH2024的专栏 397

Java多线程 - 定时器-并发与并行-线程生命周期

定时器是一种控制任务延时调用,或者周期调用的技术。作用:闹钟、定时邮件发送。

m0_74823434的博客 194

并发编程(1):并发的基本概念、Java创建线程的方式、线程生命周期、线程启动、中断、中断复位。

1、并发中的一些概念。 qps : 对于单个接口来说,每秒钟能够处理完成的请求次数,注意是处理完成的请求次数,发出请求到服务器处理完成功返回结果。 tps : 当一次请求包含多个请求的时候,注意是一次请求包含有多个请求,比如请求一个index页面,页面中的数据需要请求多个接 口,这个时候当所有的请求都收到响应后就表示一个tps,多个qps。 rt : 响应时间。 并发量 :系统能够同时处理的请求数或者事务数。 系统吞吐量 :系统吞吐量通常由q...

qq_34978129的博客 301

【Java 并发编程】线程的生命周期

使用 jconsole 可以看到 t1 的状态是 WAITING。修改上面的代码, 把 t1 中的 sleep 换成。可以看到 t1 的状态是。

大家好,我是敖云岚,一个沉迷代码的 “技术玩家”。擅长 Java、C++ 开发,对 MySQL、Redis、RabbitMQ 等技术也颇有研究。博客里既有硬核技术干货,也有诙谐幽默的编程日常分享。愿和你一起,笑着学技术,快乐敲代码! 528

全面解析Java(五)------多线程编程:从线程生命周期到并发机制的深度剖析与实践指南

本文深入探讨Java线程的方方面面,涵盖进程与线程的本质区别、线程的优缺点、实现方式(Thread、Runnable、Callable)以及创建方法。详细解析Java线程生命周期的六大状态(NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED),结合状态切换图揭示线程运行机制。文章还对比Thread.sleep(0)、wait()与sleep()的异同,助力开发者掌握多线程编程技巧。适合初学者到高级开发者学习与实践Java并发编程。

weixin_45922644的博客 1167
上一篇: 一线互联网常见的14个Java面试题,你颤抖了吗程序员
下一篇: Java对象在内存的结构
Java_No2
博客等级 码龄7年 20粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值