java多线程笔记补充之线程的生命周期

多线程通信的时候很容易造成死锁,死锁无法解决,只能避免:

当A线程等待由B线程持有的锁,而B线程正在等待A线程持有的锁时,发生死锁现象,JVM不检测也不试图避免这种情况,所以程序员必须保证不导致死锁.

避免死锁法则: 当多个线程都要访问共享的资源A,B,C时,保证每一个线程都按照相同的顺序去访问他们,比如都先访问A,接着B,最后C.

--------------------

哲学家吃面条的故事

--------------------

Thread类中过时的方法:

suspend():使正在运行的线程放弃CPU,暂停运行.

resume():是暂停的线程恢复运行.

--------------------

注意:因为容易导致死锁,所以已经被废弃了.

死锁情况:

    A线程获得对象锁,正在执行一个同步方法,如果B线程调用A线程的suspend方法,此时A线程暂停运行,此时A线程放弃CPU,但是不会放弃占用的锁.

生命周期:一个事物从出生的那一刻开始到最终死亡中间的整个过程.

在事物的漫长的生命周期过程中,总会经历不同的状态(婴儿状态/青少年状态/中年状态/老年状态...).

线程也是有生命周期的,也是存在不同的状态的,状态相互之间的转换.

有人又把阻塞状态,等待状态,计时等待状态合称为阻塞状态.如下图.

---------------------------------------------------

线程对象的状态存放在Thread类的内部类(State)中:

注意:Thread.State类其实是一个枚举类.

   因为线程对象的状态是固定的,只有6种,此时使用枚举来表示是最恰当的.


1:新建状态(new):使用new创建一个线程对象,仅仅在堆中分配内存空间,在调用start方法之前.

   新建状态下,线程压根就没有启动,仅仅只是存在一个线程对象而已.

   Thread t = new Thread();//此时t就属于新建状态

    当新建状态下的线程对象调用了start方法,此时从新建状态进入可运行状态.

    线程对象的start方法只能调用一次,否则报错:IllegalThreadStateException.

2:可运行状态(runnable):分成两种状态,ready和running。分别表示就绪状态和运行状态。

  就绪状态:线程对象调用start方法之后,等待JVM的调度(此时该线程并没有运行).

  运行状态:线程对象获得JVM调度,如果存在多个CPU,那么允许多个线程并行运行.

3:阻塞状态(blocked):正在运行的线程因为某些原因放弃CPU,暂时停止运行,就会进入阻塞状态.

         此时JVM不会给线程分配CPU,直到线程重新进入就绪状态,才有机会转到运行状态.

         阻塞状态只能先进入就绪状态,不能直接进入运行状态.

   阻塞状态的两种情况:

            1):当A线程处于运行过程时,试图获取同步锁时,却被B线程获取.此时JVM把当前A线程存到对象的锁池中,A线程进入阻塞状态.

            2):当线程处于运行过程时,发出了IO请求时,此时进入阻塞状态. 

 

4:等待状态(waiting)(等待状态只能被其他线程唤醒):此时使用的无参数的wait方法,

       1):当线程处于运行过程时,调用了wait()方法,此时JVM把当前线程存在对象等待池中.

5:计时等待状态(timed waiting)(使用了带参数的wait方法或者sleep方法)

       1):当线程处于运行过程时,调用了wait(long time)方法,此时JVM把当前线程存在对象等待池中.

       2):当前线程执行了sleep(long time)方法.

6:终止状态(terminated):通常称为死亡状态,表示线程终止.

        1):正常执行完run方法而退出(正常死亡).

        2):遇到异常而退出(出现异常之后,程序就会中断)(意外死亡).

-------------------------------------------------------------------

线程一旦终止,就不能再重启启动,否则报错(IllegalThreadStateException).

在Thread类中过时的方法(因为存在线程安全问题,所以弃用了):

 void suspend() :暂停当前线程

 void resume() :恢复当前线程

 void stop() :结束当前线程


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509440.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图结构练习——BFSDFS——判断可达性

题目描述 在古老的魔兽传说中,有两个军团,一个叫天灾,一个叫近卫。在他们所在的地域,有n个隘口,编号为1..n,某些隘口之间是有通道连接的。其中近卫军团在1号隘口,天灾军团在n号隘口。某一天&…

关于跨dll的模板单例问题

C的模板可以帮助我们编写适合不同类型的模板类&#xff0c;给代码的复用性提供了极大的方便。近来写了一个涉及单例的C模板类&#xff0c;简化下来可以归结为以下的代码&#xff1a; 1234567891011template <typename T>class Singleton{public:// 此处省去了多线程安全锁…

java多线程笔记补充之 线程控制操作

线程休眠:让执行的线程暂停一段时间&#xff0c;进入计时等待状态。 方法:staticvoid sleep(long millis) 调用sleep后&#xff0c;当前线程放弃CPU,在指定时间段之内&#xff0c;sleep所在线程不会获得执行的机会。 此状态下的线程不会释放同步锁/同步监听器. 该方法更多的用…

图结构练习——BFS——从起始点到目标点的最短步数

题目描述 在古老的魔兽传说中&#xff0c;有两个军团&#xff0c;一个叫天灾&#xff0c;一个叫近卫。在他们所在的地域&#xff0c;有n个隘口&#xff0c;编号为1..n&#xff0c;某些隘口之间是有通道连接的。其中近卫军团在1号隘口&#xff0c;天灾军团在n号隘口。某一天&…

C++中的Dll内存问题

这两天在做一个数据结构&#xff0c;使用树结构&#xff0c;两层&#xff0c;第一层的数据元素为第二层的n个分支 遇到问题如下&#xff1a; 1&#xff1a;使用vector在debug下运行正常&#xff0c;在release下源码运行正常封装后运行失败 请教了多人&#xff0c;觉得可能是vec…

Catch That Cow

题目描述 Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer John ha…

java5新特性静态引用、foreach、自动装箱和泛型枚举以及可变参数的总结

静态引用 导入(import)表示去找哪一个类&#xff0c;去哪一个包下去找哪些被使用到的类。 在java中有一个语言核心包&#xff1a;java.lang. 使用java.lang包中的API&#xff0c;不需要引用&#xff0c;直接能找到&#xff0c;但是&#xff0c;如果我们使用到的API不呼吁java.l…

C++中堆和栈的完全解析

C中堆和栈的完全解析 内存分配方面&#xff1a; 堆&#xff1a; 操作系统有一个记录空闲内存地址的链表&#xff0c;当系统收到程序的申请时&#xff0c;会遍历该链表&#xff0c;寻找第一个空间大于所申请空间的堆结点&#xff0c;然后将该结点从空闲结点链表中删 除&#xff…

数据结构实验之图论四:迷宫探索

题目描述 有一个地下迷宫&#xff0c;它的通道都是直的&#xff0c;而通道所有交叉点(包括通道的端点)上都有一盏灯和一个开关&#xff1b;请问如何从某个起点开始在迷宫中点亮所有的灯并回到起点&#xff1f;输入 连续T组数据输入&#xff0c;每组数据第一行给出三个正整数&am…

心灵的旅行

http://wzrong.blog.163.com/blog/static/1326445772012214295364/ --心灵的旅行&#xff08;陈科儒&#xff09; http://www.qixingquan.com/article-143060-1.html --神山的召唤 http://www.qixingquan.com/thread-78730-1-1.html --一个人的远方&#xff0c;独行滇西北

java8新特性lambda表达式、函数式编程、方法引用和接口默认方法以及内部类访问外部变量

一提到java是一种什么语言&#xff1f; 大多数人肯定异口同声的说是一门面向对象的语言&#xff0c;这种观点从我们开始学java就已经根深蒂固了&#xff0c;但是学到java8新特性函数式编程的时候&#xff0c;我才知道java并不是纯面向对象的语言。 lambda表达式的详细教程 lam…

C++ 中export 关键字的尴尬处境

分离编译模式&#xff08;Separate Compilation Model&#xff09;允许在一处翻译单元&#xff08;Translation Unit&#xff09;中定义&#xff08;define&#xff09;函数、类型、类对象等&#xff0c;在另一处翻译单元引用它们。编译器&#xff08;Compiler&#xff09;处理…

图结构练习——最短路径

题目描述 给定一个带权无向图&#xff0c;求节点1到节点n的最短路径。 输入 输入包含多组数据&#xff0c;格式如下。 第一行包括两个整数n m&#xff0c;代表节点个数和边的个数。(n<100)剩下m行每行3个正整数a b c&#xff0c;代表节点a和节点b之间有一条边&#xff0c;权…

C++强大背后

在31年前(1979年)&#xff0c;一名刚获得博士学位的研究员&#xff0c;为了开发一个软件项目发明了一门新编程语言&#xff0c;该研究员名为Bjarne Stroustrup&#xff0c;该门语言则命名为——C with classes&#xff0c;四年后改称为C。C是一门通用编程语言&#xff0c;支持多…

javaWeb回忆思维导图

出处&#xff1a;https://blog.csdn.net/jackfrued/article/details/42617675 https://www.cnblogs.com/xieyupeng/p/6961667.html

如何理解const char*, char const*, char*const等

const char*, char const*, char*const的区别问题几乎是C面试中每次都会有的题目。 事实上这个概念谁都有,只是三种声明方式非常相似很容易记混。 Bjarne在他的The C Programming Language里面给出过一个助记的方法&#xff1a; 把一个声明从右向左读。 char * const cp; …

查找练习 hash——出现过的数字

题目描述 有一个数据字典&#xff0c;里面存有n个数字(n<100000)&#xff0c;小明现在接到一个任务&#xff0c;这项任务看起来非常简单——给定m个数字&#xff0c;分别查询这m个数字是否出现在字典之中&#xff1b;但是考虑到数据量的问题&#xff0c;小明找到了善于编程的…

读过的最好的 C++ 开源代码

https://www.zhihu.com/question/21376384

数据结构实验之查找五:平方之哈希表

题目描述 给定的一组无重复数据的正整数&#xff0c;根据给定的哈希函数建立其对应hash表&#xff0c;哈希函数是H(Key)Key%P&#xff0c;P是哈希表表长&#xff0c;P是素数&#xff0c;处理冲突的方法采用平方探测方法&#xff0c;增量dii^2,i1,2,3,...,m-1 输入 输入一组测试…

Spring详细导包截图以及IOC和DI思想

思想 IOC DI Spring中的工厂(容器) ApplicationContext&#xff1a; BeanFactory(过时)&#xff1a; BeanFactory和ApplicationContext区别 BeanFactory&#xff1a; 1.Spring原始接口&#xff0c;针对原始接口实现类功能较为单一 2.是在getBean的时候才会生成类的实例…