首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用stop 等方法实现线程的优先级

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

原创
作者头像
用户7365393
修改2021-10-08 15:21:49
3070
修改2021-10-08 15:21:49
举报
使用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

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用stop方法
  • 暂停线程
  • yield方法
  • 线程的优先级
  • 守护线程
    • 使用退出标志
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档