java里面的线程保证线程的安全:Java多线程没什么难的
java里面的线程保证线程的安全:Java多线程没什么难的33993398暂停线程意味着此线程还可以恢复运行。在Java多线程中,可以使用 suspend() 方法暂停线程,使用 resume()方法恢复线程的执行。这俩方法已经和stop()一样都被弃用了,因为如果使用不当,极易造成公共的同步对象的独占,使得其他线程无法访问公共同步对象。示例如下:打印结果:
本篇文章是一个系列文章,旨在简单、快速的重拾多线程的基础用法,深入浅出的捋清楚多线程的边边角角。
前俩篇文章,我们聊过了多线程的基础用法,以及停止线程。今天我们的话题比较的咋,浅出一下多线程基础篇的余下内容。
系列其他文章可以在历史文章中查阅~
文章内容,来自博客园:像风一样。感兴趣的小伙伴可以移步自行关注。
一、暂停线程暂停线程意味着此线程还可以恢复运行。在Java多线程中,可以使用 suspend() 方法暂停线程,使用 resume()方法恢复线程的执行。
这俩方法已经和stop()一样都被弃用了,因为如果使用不当,极易造成公共的同步对象的独占,使得其他线程无法访问公共同步对象。示例如下:
打印结果:
3398
3399
3400
3401
执行上段程序永远不会打印main end。出现这样的原因是,当程序运行到 println() 方法内部停止时,PrintStream对象同步锁未被释放。方法 println() 源代码如下:
这导致当前PrintStream对象的println() 方法一直呈“暂停”状态,并且锁未被myThread线程释放,而main()方法中的代码System.out.println("main end") 还在傻傻的排队等待,导致迟迟不能运行打印。
使用 suspend() 和 resume() 方法也容易因为线程的暂停而导致数据不同步的情况,示例如下:
打印结果:
bb AA
二、yield()方法yield() 方法的作用是放弃当前的CPU资源,将它让给其他的任务去占用CPU执行时间。但放弃的时间不确定,有可能刚刚放弃,马上又获得CPU时间片。
public static void yield() 暂停当前正在执行的线程对象,并执行其他线程。
三、线程的优先级在操作系统中,线程可以划分优先级,优先级较高的线程得到的CPU资源较多,也就是CPU优先执行优先级较高的线程对象中的任务。
设置线程优先级有助于帮“线程规划器”确定在下一次选择哪一个线程来优先执行。
设置线程优先级使用setPriority()方法,此方法的JDK源码如下:
在Java中,线程优先级划分为1 ~ 10 这10个等级,如果小于1或大于10,则JDK抛出异常。
从JDK定义的3个优先级常量可知,线程优先级默认为5。
public final static int MIN_PRIORITY = 1; public final static int NORM_PRIORITY = 5; public final static int MAX_PRIORITY = 10;
线程优先级具有继承性,比如A线程启动B线程,则B线程的优先级与A是一样的。
线程优先级具有规则性,线程的优先级与在代码中执行start()方法的顺序无关,与优先级大小有关。
线程优先级具有随机性,CPU尽量使线程优先级较高的先执行完,但无法百分百肯定。也就是说,线程优先级较高的不一定比线程优先级较低的先执行。
四、守护线程在Java中有两种线程,一种是用户线程,一种守护线程。
什么是守护线程?守护线程是一种特殊的线程,当进程中不存在非守护线程了,则守护线程自动销毁。典型的守护线程就是垃圾回收线程,当进程中没有非守护线程了,则垃圾回收线程也就没有了存在的必要了,自动销毁。可以简单地说:任何一个守护线程都是非守护线程的保姆。
如何设置守护线程?通过Thread.setDaemon(false)设置为用户线程,通过Thread.setDaemon(true)设置为守护线程。如果不设置属性,默认为用户线程。
thread.setDaemon(true);
示例如下:
打印结果:
i=1
i=2
i=3
i=4
i=5
我离开后thread对象也就不再打印了
尾声浅出部分的系列文章到此就结束了。希望可以给各位小伙伴带来一丝丝的帮助。
接下来就是《深入多线程》的系列文章了~