专栏首页人生得意须尽欢使用stop 等方法实现线程的优先级
原创

使用stop 等方法实现线程的优先级

使用stop方法

  方法stop()已经被作废,因为如果强制让线程停止则有可能使一些清理性的工作得不到完成。就象突然关闭计算机电源,而不是按正常程序关机一样,可能会产生不可预料的结果。另外一个情况就是对锁定的对象进行了 “解锁”,导致数据得不到同步的处理,出现数据不一致的问题(比如一个线程正在修改数据,刚改了一半被stop了,那么就会出现数据不一致)。

暂停线程

  暂停线程意味着此线程还可以恢复运行。在Java多线程中,不推荐使用suspend()方法暂停线程,使用resume()方法恢复线程的执行,原因如下:   假设两个线程A、B和一个资源P,B锁定了资源P,A调用suspend()方法中断线程B,但同时A又想获取资源P。对任何线程来说,如果它们想中断目标线程,同时又试图使用这个线程锁定的资源,就会造成死锁,也就是暂停未释放锁。但如果暂停释放了锁,又可能出现不同步问题,比如线程B正在修改P中的数据,刚修改一半被suspend了,然后他释放了P的锁,A线程获得P会发现P中的数据不一致。   如何正确的挂起一个线程:可以在Thread实例外设置一个volatile 修饰的boolean变量,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用 wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()重新启动线程。同时 ,wait() 和 notify() 这一对方法必须在 synchronized 方法或块中调用,理由也很简单,只有在 synchronized 方法或块中当前线程才占有锁,才有锁可以释放。后面章节我们会介绍。

yield方法

  yield()方法的作用是放弃当前的CPU资源,将它让给其他的任务去占用CPU执行时间。但它不会阻塞该线程,它只是将该线程转入到就绪状态。即让当前线程暂停一下,让系统的线程调度器重新调度一次,完全可能的情况是:当某个线程调用了yield()方法暂停之后,线程调度器又将其调度出来重新执行。   当某个线程调用了yield()方法之后,只有优先级与当前线程相同或者比当前线程更高的处于就绪状态的线程才会获得执行机会。

线程的优先级

  在操作系统中,线程可以划分优先级,优先级较高的线程得到的CPU资源较多,也就是CPU优先执行优先级较高的线程对象中的任务。设置线程优先级有助于帮“线程规划器”确定下一次选择哪一个线程来优先执行。   设置线程的优先级使用setPriority()方法,在Java中,线程的优先级分为1 ~ 10这10个等级,如果小于1或大于10,则JDK抛出异常 throw new IllegalArgumentException()。默认优先级是5。   在Java中,线程的优先级具有继承性,比如A线程启动B线程,则B线程的优先级与 A是一样的。   优先级高只能保证更大概率的被优先执行,但并不保证一定被先执行完。所以不要把线程的优先级与运行结果的顺序作为衡量的标准,优先级较高的线程并不一定每一次都先执行完run()方法中的任务,也就是说, 线程优先级与打印顺序无关,不要将这两者的关系相关联,它们的关系具有不确定性和随机性。

守护线程

  在Java线程中有两种线程,一种是用户线程,另一种是守护Daemon[ˈdi:mən]线程。   守护线程是一种特殊的线程,又称服务进程、后台线程,是指在程序运行时在后台提供一种通用服务的线程,这种线程并不属于程序中不可或缺的部分。当进程中不存在非守护线程了,则守护线程自动销毁。典型的守护线程就是垃圾回收线程,当进程中没有非守护线程了,则垃圾回收线程也就没有存在的必要了,自动销毁。用个比较通俗的比喻来解释一下 “守护线程”:任何一个守护线程都是整个JVM中所有非守护线程的“保姆”,只要当前JVM 实例中存在任何一个非守护线程没有结束,守护线程就在工作,只有当最后一个非守护线程结束时,守护线程才随着JVM 一同结束工作。

使用退出标志

public class MyThread extends Thread {
	public volatile boolean stop =false; //必须用volatile保证可见性
	@Override
	public void run() {
		int i = 0;
		while(!stop){
			System.out.println("i=" + i++);
		}
	}
}
public class Run {
	public static void main(String[] args) throws InterruptedException {
		MyThread t=new MyThread();
		t.start();
		Thread.sleep(2000);
		t.stop = true;
		System.out.println(t.isAlive());
	}
}

输出:

i=256163
i=256164
i=256165
true

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用stop 等方法实现线程的优先级

    方法stop()已经被作废,因为如果强制让线程停止则有可能使一些清理性的工作得不到完成。就象突然关闭计算机电源,而不是按正常程序关机一样,可能会产生不可预料的结...

    用户7365393
  • Android 使用心得 ❄️| 使用adb命令查看某个 进程 的 线程优先级 !

    我这里使用的是ps -A | grep com,可以筛选出进程名中带有‘com’的,方便查找自己想要看的进程,如下所示

    呆呆敲代码的小Y
  • Java中多线程的使用(超级超级详细)+多线程的实现原理 2

    程序启动运行main的时候,java虚拟机启动一个进程,主线程main在main()被调用的时候被创建使用myThread.start()的时候,另外一个线程叶...

    一只胡说八道的猴子
  • Java-并发入门

    多线程程序包含两个或多个可同时运行的部分,每个部分可以同时处理不同的任务,从而能更好地利用可用资源,特别是当计算机有多个CPU的时候。

    小小工匠
  • java多线程编程核心技术——第一章总结 1.5sleep()方法

    1.1进程、多线程的概念及线程的优点 进程的概念: 百度百科讲解: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和...

    用户1134788
  • jvm源码解析(三)线程状态

    有些书上Waitting和Timed_Watting是归类在Blocked下的所以说是五种状态,有些书是单独拿出来的,所以是七种状态。大多数情况下承认五种状态。

    用户6203048
  • 43道多线程面试题,附带答案(二)

    答: ① sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运...

    李红
  • 43道多线程面试题,附带答案(二)

    答:① sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行...

    李红
  • 多线程之间实现通讯,join,yield,lock

    答:多线程之间的通讯,就是多个线程操作同一个全局变量时候,做的操作不同。如一个读,一个写。

    斯文的程序
  • 并发编程之线程第一篇

    Java虚拟机栈 JVM中由堆、栈、方法区所组成,其中栈内存是给线程使用,每个线程启动后,虚拟机就会为其分配一块栈内存。

    海仔
  • Java中的多线程

    1、 线程中的主要方法     a) isAlive() 判断线程是否还活着,即线程是否未终止     b) getPriority() 获得线程的优先级   ...

    lizelu
  • 25道多线程面试题,附带答案(一)

    是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。

    李红
  • 25道多线程面试题,附带答案(一)

    是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。

    李红
  • Java 多线程 Thread 和 Runnable

    多线程是并行计算实现的方式, 但是在单cpu中实际上没有真正的并行,只不过是多个任务通过cpu的快速轮转,产生多任务同一时间运行的错觉.而其中的任务就是进程. ...

    黑白格
  • JVM相关 - SafePoint 与 Stop The World 全解(基于OpenJDK 11版本)

    对于这些操作,都需要线程的各种信息,例如寄存器中到底有啥,堆使用信息以及栈方法代码信息等等等等,并且做这些操作的时候,线程需要暂停,等到这些操作完成,否则会有并...

    干货满满张哈希
  • 并发学习笔记12-线程基础(上)

    现代操作系统调度的最小单元是线程,也叫轻量级进程(Light Weight Process)。

    WindCoder
  • 线程的基本操作

    用户1216491
  • 数据处理思想和程序架构: 对使用的数据进行优先等级排序的缓存

    <p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/单片机知识点总结/directory...

    杨奉武
  • 并发编程之多线程

    并发编程之多线程

    Java架构师必看

扫码关注云+社区

领取腾讯云代金券