黑马程序员 Java多线程

CATIA_DELMIA_V5R2019安装包下载及安装教程破解 CATIA_V5R2019/DELMIA_V5R2019安装包下载及安装教程破解 阅读详情

------- android培训、java培训、期待与您交流! ----------

1,可以使用静态方法Thread.currentTread().getName()来获取当前线程的线程名
2,如果我们对某个线程对象在启动之前调用了setDaemon(true)方法,这个线程就变成了后台线程,对JAVA程序来说,只要还有一个前台线程在运行,这个进程就不会结束,如果一个进程中只有后台线程运行,这个进程就会结束,setDaemon方法首先调用该线程的checkAccess方法,且不带任何参数。这可能抛出 SecurityException(在当前线程中)如果指示线程没有处于请求操作所要求的适当状态还会抛出IllegalThreadStateException异常
注:
checkAccess public final void checkAccess()
判定当前运行的线程是否有权修改该线程。如果有安全管理器,则调用其 checkAccess方法,并将该线程作为其参数。这可能导致抛出 SecurityException -如果不允许当前线程访问该线程
3,线程A调用线程B的join()方法后,线程A就会等线程B结束后才继续运行,join()等待该线程终止,join(long millis)等待该线程终止的时间最长为 millis毫秒。join(long millis,int nanos)等待该线程终止的时间最长为 millis毫秒 + nanos 纳秒。
注:
join
public final void join(long millis,  int nanos) throwsInterruptedException
等待该线程终止的时间最长为 millis毫秒 + nanos 纳秒。

参数:
millis -
以毫秒为单位的等待时间。
nanos -
要等待的 0-999999附加纳秒。 
抛出: 
IllegalArgumentException -
如果 millis值为负,则 nanos的值不在 0-999999范围内。 
InterruptedException -
如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态被清除。

public final void join()  throwsInterruptedException等待该线程终止。

抛出: 
InterruptedException -
如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态被清除。
public final void join(long millis) throws InterruptedException
等待该线程终止的时间最长为 millis毫秒。超时为 0 意味着要一直等下去。

参数:
millis -
以毫秒为单位的等待时间。 
抛出: 
InterruptedException -
如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态被清除。
4,创建多线程有两种方式,一种是继承Thread类,另一种是实现Runnable接口,我觉得如果能使用接口就选择接口,因为这确实能很好地体现出面向对象的设计思想
5,sleep
public static void sleep(long millis) throws InterruptedException
在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。该线程不丢失任何监视器的所属权。

参数:
millis -
以毫秒为单位的休眠时间。 
抛出: 
InterruptedException -
如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态被清除。
6,当在线程A中启动了线程B后,CPU不一定立刻跳转到线程B,它很可能要再在线程A中执行一会儿了再跳转到线程B,为了让CPU立刻跳转到线程B,我们可以在启到了线程B后在线程A中调用Tread类中的sleep方法让线程A等待一会儿
7,synchronized的四种用法:
(1)方法声明时使用,放在范围操作符(public等)之后,返回类型声明(void等)之前,即一次只能有一个线程进入该方法,其他线程想在此时调用该方法,只能排队等候,当前线程(就是在synchronized方法内部的线程)执行完该方法后,别的线程才能进入。
(2)对某一代码块使用,synchronized后跟括号,括号里是变量,这样一次只有一个线程进入该代码块。
(3)synchronized后面括号里是一对象,如果线程进入,则得到对象锁,那么别的线程在该类所有对象上的任何操作都不能进行。在对象级使用锁通常是一种比较粗糙的方法。为什么要将整个对象都上锁,而不允许其他线程短暂地使用对象中其他同步方法来访问共享资源?如果一个对象拥有多个资源,就不需要只为了让一个线程使用其中一部分资源,就将所有线程都锁在外面。由于每个对象都有锁,所以可以使用虚拟对象来上锁.
  (4)synchronized
后面括号里是类,如果线程进入,则线程在该类中所有操作不能进行,包括静态变量和静态方法,实际上,对于含有静态方法和静态变量的代码块的同步,我们通常用4来加锁
以上4种之间的关系:
锁是和对象相关联的,每个对象有一把锁,为了执行synchronized语句,线程必须能够获得synchronized语句中表达式指定的对象锁,一个对象只有一把锁,被一个线程获得之后它就不再拥有这把锁,线程在执行完synchronized语句后,将获得锁交还给对象。在方法前面加上synchronized修饰符即可以将一个方法声明为同步化方法。同步化方法在执行之前获得一个锁。如果这是一个类方法,那么获得的锁是和声明方法的类相关的Class类对象的锁,如果这个一个实例方法,那么此锁是this对象的锁。
8,public final void wait(long timeout) throwsInterruptedException
参数:
timeout -
要等待的最长时间(以毫秒为单位)。 
抛出: 
IllegalArgumentException -
如果超时值为负。 
IllegalMonitorStateException -
如果当前线程不是此对象监视器的所有者。 
InterruptedException -
如果在当前线程等待通知之前或者正在等待通知时,任何线程中断了当前线程。在抛出此异常时,当前线程的中断状态被清除。
public final void wait(long timeout, int nanos) throwsInterruptedException
参数:
timeout -
要等待的最长时间(以毫秒为单位)。
nanos -
额外时间(以毫微秒为单位,范围是 0-999999)。 
抛出: 
IllegalArgumentException -
如果超时值是负数,或者毫微秒值不在 0-999999范围内。 
IllegalMonitorStateException -
如果当前线程不是此对象监视器的所有者。 
InterruptedException -
如果在当前线程等待通知之前或者正在等待通知时,任何线程中断了当前线程。在抛出此异常时,当前线程的中断状态被清除。
public final void wait()
(等价于wait(0))throws InterruptedException
抛出: 
IllegalMonitorStateException -
如果当前线程不是此对象监视器的所有者。 
InterruptedException -
如果在当前线程等待通知之前或者正在等待通知时,任何线程中断了当前线程。在抛出此异常时,当前线程的中断状态被清除。
9,public final void notify()唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。
直到当前线程放弃此对象上的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争;例如,唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势。

此方法只应由作为此对象监视器的所有者的线程来调用。通过以下三种方法之一,线程可以成为此对象监视器的所有者:

通过执行此对象的同步实例方法。 
通过执行在此对象上进行同步的 synchronized语句的正文。 
对于 Class 类型的对象,可以通过执行该类的同步静态方法。 
一次只能有一个线程拥有对象的监视器。 
抛出: 
IllegalMonitorStateException -
如果当前线程不是此对象监视器的所有者。
10,public final void notifyAll()唤醒在此对象监视器上等待的所有线程。线程通过调用其中一个 wait方法,在对象的监视器上等待。
直到当前线程放弃此对象上的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争;例如,唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势。

此方法只应由作为此对象监视器的所有者的线程来调用。有关线程能够成为监视器所有者的方法的描述,请参阅 notify方法。 
抛出: 
IllegalMonitorStateException -
如果当前线程不是此对象监视器的所有者。

11,练习题:子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程又循环100次,如此循环50次,请写出程序

这道题我和张老师做得不一样,他是把主线程循环的100次和和子线程循环10次写成两个方法的,而我是写成一个方法通过传递所需循环的次数的参数来实现的

1.    public class ThreadTest {  

2.        public static void main(String[] args) {  

3.            final ThreadCommunication threadCommunication = new ThreadCommunication();  

4.            new Thread(new Runnable() {  

5.                @Override  

6.                public void run() {  

7.                    for (int i = 1; i <= 50; i++) {  

8.                        threadCommunication.print(10);  

9.                    }  

10.              }  

11.          }).start();  

12.          for (int i = 1; i <= 50; i++) {  

13.              threadCommunication.print(100);  

14.          }  

15.      }  

16.  }  

17.    

18.  class ThreadCommunication {  

19.      private int temp;  

20.      private boolean flag = true;  

21.    

22.      public synchronized void print(int num) {  

23.          while (!flag & 10 == num || flag & 100 == num) {  

24.              try {  

25.                  this.wait();  

26.              } catch (InterruptedException e) {  

27.                  e.printStackTrace();  

28.              }  

29.          }  

30.          for (temp = num; temp > 0; temp--) {  

31.              System.out.println(Thread.currentThread().getName() + temp);  

32.          }  

33.    

34.          flag = false == flag ? true : false;  

35.          this.notify();  

36.      }  

37.  }  

12,张老师在视频中提到了捕获线程死亡事件,这个在课堂上没有找到方法,我就好奇的也试着看了看API,这是我个人的捕获线程死亡事件做法,也不知道是不是这么一回事

1.    public class CatchThreadTerminate {  

2.        public static void main(String[] args) {  

3.            final Thread thread = new Thread(new Runnable() {  

4.                @Override  

5.                public void run() {  

6.                    for (int i = 0; i <= 100; i++) {  

7.                        System.out.println(i);  

8.                    }  

9.                }  

10.          });  

11.          thread.start();// 启动thread线程  

12.          new Thread(new Runnable() {  

13.    

14.              @Override  

15.              public void run() {  

16.                  while (true) {  

17.                      if (Thread.State.TERMINATED == thread.getState()) {  

18.                          /* 如果thread线程死亡则打印下面这条语句 */  

19.                          System.out.println("线程死亡");  

20.                          break;// 已经捕获到thread的死亡,结束监听  

21.                      }  

22.                  }  

23.              }  

24.    

25.          }).start();// 启动一个线程来监听thread线程是否是亡  

26.      }  

27.  }  

 

使用Simulink对液流电池在微电网中的动态响应进行建模与仿真 本文介绍了使用Simulink对液流电池在微电网中的动态响应进行建模与仿真的方法。通过搭建包含液流电池、双向DC-DC变换器、分布式能源和负载的微电网模型,并设计基于SOC的控制器,详细说明了从模型创建到仿真运行的完整流程。重点分析了液流电池在不同负载条件下的动态特性,评估了系统响应速度、充放电效率和稳定性等性能指标。该仿真方法为验证液流电池在微电网中的应用提供有效工具,有助于优化参数设计和提升系统可靠性。 阅读详情

相关推荐

【SABRE 3D, SABRE 3DxT,LAM设备】2025年9月13日-安全配置-准备工作

请遵循本规程将SABRE 3D/3DxT/3D Scimitar系统设置为安全配置,以便能够在电镀单元、APT模块、XMM(或SRD)模块、工厂接口(FI)外壳或中央通道内部及周边区域执行作业p104-p117。在生产过程中暂停调度程序存在一定风险:若待维护模块未离线且在其他模块完成处理前重启调度程序,可能对生产晶圆造成影响。维护人员需特别注意电镀模块内的晶圆状态,并尽可能快速地恢复调度程序。确认待维护模块内无晶圆滞留暂停调度程序并将相应模块设置为离线状态打开模块检修门并关闭安全盖板(槽位)

weixin_46735260的博客 1363

Java黑马程序员-多线程笔记

哔哩哔哩java黑马视频笔记

luohanisme的博客 1457

别再只盯着GPS了!手把手教你用Python仿真UWB定位,30厘米精度是怎么算出来的?

本文详细解析了UWB(超宽带)室内定位技术的原理与实现,通过Python代码演示如何从三边测量法到实现30厘米精度的定位。文章涵盖了UWB的核心数学模型、Python仿真环境搭建、误差分析及优化策略,为开发者提供了实用的技术指南和应用场景。

weixin_26873711的博客 252

黑马程序员——java多线程

------------------ android培训、java培训期待与您交流! ---------- //===================================================================== //@TITLE: //    java多线程 //@AUTHOR: //    Benwolf //@DATE: //

xiao789123的专栏 550

5G MBS(组播广播服务)深度解析:从标准架构到商用实践

5G MBS(组播广播服务)深度解析:从标准架构到商用实践

大家好,我是码农老gou,一名专注于编程技术的程序员。在这个博客中,我将与大家分享我在工作和学习中的经验、见解以及一些实用的技术干货。 1079

STM32 上 FreeRTOS 的启动与任务调度详解

4. SysTick定时器:FreeRTOS启动调度器后,会接管STM32的SysTick定时器,用于生成系统节拍,因此不要在HAL库中重复配置SysTick(比如HAL_Init()中已配置,无需再手动调用SysTick_Config()),否则会导致系统节拍异常,任务延迟不准。2. 任务栈大小需按需配置,不是越大越好(浪费RAM),也不能太小(会导致栈溢出),比如简单的传感器读取任务,1024字(4096字节)足够,复杂任务(比如串口接收+数据解析)可调整为2048字。

qq_40170041的博客 866

黑马程序员——Java 多线程

------- android培训、java培训、期待与您交流! ---------- Java网络编程 ------- android培训、java培训、期待与您交流! ----------

毒匠的专栏 777

【ComfyUI】QwenImageEdit + Z-Image 面部融合图生图

本文介绍了一种基于Stable Video Diffusion(SVD)模型的ComfyUI图生视频工作流,能够将静态图片转换为动态视频。工作流包含模型加载、图像导入、条件生成、视频采样、解码合成等8个核心步骤,通过SVD_img2vid_Conditioning节点实现视觉语义转换。该方案适用于创意视频制作、产品演示等场景,支持设计师和AI爱好者快速实现"以图生动"效果。文中详细说明了工作流架构、关键节点功能、操作流程及应用案例,并提供了模型参数和使用注意事项。

Mr数据杨 1806

黑马程序员_Java多线程

-------    android培训、java培训、期待与您交流! ----------

bearzw的博客 756

在 SAP GUI Editor 中使用 OpenAI 自动生成 ABAP 代码 —— 技术实践与思考

在传统 SAP GUI Editor 场景下融入OpenAI开发者表达意图,模型负责实现。随着的持续演进,以及Joule等官方 Copilot 的加入,未来 ABAP 开发形态必将更加专注业务逻辑与架构设计,而把样板式编码交给 AI 自动完成。现在就动手试试,让你的下一段 ABAP 由 AI 来书写吧!

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

泰凌微8258入门教程 基础篇①——Bluetooth® SIG Mesh 快速上手

Bluetooth® SIG Mesh Quick Start

6728

黑马程序员——Java多线程

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 自学Java第六天笔记。本人是根据毕向东老师的JavaSE视频学习的。 Java多线程 一.多线程理解。 1.进程: 是一个正在执行中的程序(其实进程就是一个应用程序运行时的内存分配空间)。每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者叫一个

zhaofengshiwo的专栏 428

调节桌面图标大小的方法(编程)

如果你对其他操作系统或编程语言有类似的需求,可以根据具体的情况进行相应的调整和搜索相关的库和方法。在编程中,我们可以使用各种桌面应用程序来调节桌面图标的大小。库提供的函数,我们获取了桌面图标的窗口句柄,并使用Windows消息发送方式设置图标的大小。你可以根据自己的需求修改代码中的图标大小值,并在运行代码后观察桌面图标的变化。函数并传入所需的图标大小,这里设置为48x48像素。首先,我们需要使用Python的第三现的方法。首先,我们需要使用Python的第三方库。首先,我们需要使用实现的方法。

CyberFlare的博客 437

黑马程序员——JAVA之多线程

------- http://www.itheima.com" target="blank">android培训java">http://www.itheima.com"target="blank">java培训、期待与您交流!   基础知识概述   package com.hyx; /* 一、关于进程和线程 * 进程:正在运行的程序,是系统进行资源分配和调用的独立单位;每一个

hou0201_的博客 440

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

黑马程序员_java之多线程

------- android培训、java培训、期待与您交流! ----------   多线程:  1、多线程        进程:正在运行的程序叫进程        线程:进程在执行过程中,可能需要多个任务同时执行,每个任务的执行者就是线程  2、jvm启动是多线程  3、如何实现多线程:       A:继承Thread类      步骤:      定义一个类

wsw6807的专栏 303

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

黑马程序员Java笔记——多线程篇

----------- android培训、java培训、java学习型技术博客、期待与您交流! --------- 关键词: 多线程的秘密花园、 Thread先生与Runnable小姐、同步 引子:     现实生活中,我们可以同时做很多事情:在写代码的同时可以听音乐;在做饭的同时可以打电话等……。在使用计算机的时候也可以一边听歌,一边玩游戏。那么我们Java是否支持多线程呢

晴耕雨读 692

jre9下载 jdk9

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

黑马程序员--Java多线程

——- android培训、java培训、期待与您交流! ———-进程与线程要想了解多线程,必须先了解线程,而要想了解线程,必须先了解进程,因为线程是依赖于进程而存在。什么是进程通过任务管理器我们就看到了进程的存在。 而通过观察,我们发现只有运行的程序才会出现进程。 进程:就是正在运行的程序。 进程是系统进行资源分配和调用的独立单位。每一个进程都有它自己的内存空间和系统资源。多进程的意义单进程

Sherlock_Li的博客 635

黑马程序员——JAVA多线程

----Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------ 1:多线程 (1)多线程:一个应用程序有多条执行路径 进程:正在执行的应用程序 线程:进程的执行单元,执行路径 单线程:一个应用程序只有一条执行路径 多线程:一个应用程序有多条执行路径 多进程的意义? 提高CPU的使用率 多线程的意义? 提高应用程序的使用率 (2)Java程

skyHeXin的博客 475

黑马程序员——java的多线程

------- android培训、java培训、期待与您交流! ---------- 前言:通过观看毕向东老师的java基础视频,查漏补缺,将一些自己掌握的还不牢固的知识写出来,希望和大家交流分享。 一、进程与线程        进程:正在执行的程序。每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者叫一个控制单元。        线程:把进程中的功能分成各个部分,每个部分有一个

hgdswj的博客 658

黑马程序员 Java多线程总结

------- android培训、java培训、java学习型技术博客、期待与您交流! ---------- 什么是线程 进程:是一个正在执行的程序 (例如:windows任务管理器里面显示的那些就是进程) 线程:就是进程中的一个独立的控制单元,线程在控制着进程的执行,Java 虚拟机允许应用程序并发地运行多个执行线程。 多线程在JVM中的体现。 主线程:负责java程

ice1988的学习笔记 352

黑马程序员——Java异常&多线程

------- android培训、java培训、期待与您交流! ---------- 一、异常 程序出现的不正常的情况。在java中用类的形式对不正常情况进行了描述和封装对象。 描述不正常的情况的类,就称为异常类。 问题很多,意味着描述的类也很多,将其共性进行向上抽取,形成了异常体系。 1:Throwable |--Error 严重问题,我们不处理。 |--E

Donald1989的博客 559

黑马程序员-java多线程

黑马程序员-多线程

u010513299的专栏 464

黑马程序员——Java中 多线程笔记

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 一、多线程概述 进程:正在运行的程序,是系统进行资源分配和调用的独立单位。  每一个进程都有它自己的内存空间和系统资源。       线程:是进程中的单个顺序控制流,是一条执行路径  一个进程如果只有一条执行路径,则称为单线程程序。  一个进程如果有多条执行

bayueqinglian的专栏 535
上一篇: 黑马程序员 Java IO操作
下一篇: 黑马程序员 Java网络编程
focusjava
博客等级 码龄14年 127粉丝 528原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值