这是一个过期的方法,与void resume()搭配使用来暂停和唤醒一个线程。这两个方法有可能形成独占和不一样步的问题—详见《java多线程编程核心技术》。方法源码以下:html
@Deprecated public final void suspend() { checkAccess(); suspend0(); }
首先当前线程的checkAccess()方法被调用,其有可能致使SecurityException。若是当前线程时活跃着的,则挂起,调用resume()方法激活。相关方法checkAccess()和suspend0()源码以下:java
/** *检测当前运行的线程是否有权限修改这个线程 * 好比main线程使用代码someThread.suspend()来修改someThread线程; *若是有 安全管理器/SecurityManagy,则将被修改的线程做为参数调用安全管理器的 *checkAccess方法。 * *若是当前线程没有权限修改被修改的线程,则抛出SecurityException异常。 */ public final void checkAccess() { SecurityManager security = System.getSecurityManager(); if (security != null) { security.checkAccess(this); } }
native指Java调用本地方法,一般为非java语言实现编程
private native void suspend0();//原来源码名称后缀数字的是这个意思
resume()方法同理,也是一个过期的唤醒线程的方法。若是当前线程没有权限修改被唤醒的线程,则抛出SecurityException异常
安全
@Deprecated public final void resume() { checkAccess(); resume0(); }
void yield()
Thread.yield()
是指当前线程已经完成重要操做,建议线程调度器将cpu资源从转移给另外一个线程:
多线程
public static native void yield();
线程优先级为1~10,数字越高表明级别越高优先级越高。Thread类中设置了三个默认的优先级属性:
ide
/** * The minimum priority that a thread can have. */ public final static int MIN_PRIORITY = 1; /** * The default priority that is assigned to a thread. */ public final static int NORM_PRIORITY = 5; /** * The maximum priority that a thread can have. */ public final static int MAX_PRIORITY = 10;
当咱们在使用void setPriority(int newPriority) 设置线程的优先级时,数字必须在这个区间。方法源码以下:函数
/** *final方法:不能被改写;final类不能被继承; * * * */ public final void setPriority(int newPriority) { ThreadGroup g; checkAccess();//检查当前线程是否有修改此线程优先级的权限; if (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY) {//优先级必须在[1,10]之间,不然抛异常:非法参数 throw new IllegalArgumentException(); } //fixme 返回被修改线程所在的线程组,若是被修改线程结束则返回null。若是要设置的值大于所在组线程的能够有的最大值,则自动下降为当前线程组已有的最大值。 if((g = getThreadGroup()) != null) { if (newPriority > g.getMaxPriority()) { newPriority = g.getMaxPriority(); } setPriority0(priority = newPriority); } }
这里有一个须要注意的点:若是要设置的值大于所在组线程的能够有的最大值,则自动下降为当前线程组已有的最大值。除此以外:
1.线程具备继承性,即被建立的线程与其建立者具备相同的优先级;
2.线程优先级即具备“规则性”,又具备“随机性”,即优先级高的线程有限执行,但其run()方法中任务又不必定是最早执行完。cup只是尽可能将资源让给优先级比较高的线程,可是代码先运行、优先级高的线程不必定最早执行完。
综上,线程的优先级具备1.组自贬性;2.继承性;3.随机性测试
守护进程也可理解为“保姆进程”,当所须要服务的“雇主进程们”结束了,保姆进程自动销毁。最典型的守护进程是GC垃圾回收器。调用Thread 的setDaemon(boolean )方法传参true将进程设置为守护进程,此方法只能在start()调用之间调用,即进程为非存活的状态下。方法源码以下:this
public final void setDaemon(boolean on) { checkAccess(); if (isAlive()) {//若是当前线程已经经过start()方法激活,则不能在更改其类型。 throw new IllegalThreadStateException(); } daemon = on;//daemon是Thread类变量,标识其是不是守护进程 }
中止一个线程使用interrupt()
方法
除非线程要中断自己。此操做是为当前线程作标识“能够中止”,而非真正的中止线程。线程
若是线程在调用wait()、join()、sleep()
及其各类变参多态函数后,再调用interrupt()
方法会清空其interurpted
的状态,并抛出InterruptedException
异常。
线程是不是“可中止状态”能够调用两个方法:
boolean interrupted()
:会清除“可中止状态”,测试的是当前线程;2.boolean isInterrupted()
:不会清除状态,测试的是Thread对象;
//参数表示返回其当前状态后是否将其从新设置为“不可中止” private native boolean isInterrupted(boolean ClearInterrupted);
两个方法源码以下:
public static boolean interrupted() { return currentThread().isInterrupted(true); } public boolean isInterrupted() { return isInterrupted(false); }
中止线程书中讲解了三种方式:
异常法即当咱们使用interrupted()(当前current线程)已经标记为“可中止”时,能够在run()方法中抛出异常并在run()方法的最后捕获异常,以此来中止线程。示例代码以下:
public DemoClass extends Thread{ @Override public void run(){ try{ //doSomeThing if(this.interrupted()){ throw new InterruptedException(); } }catch(InterruptedException e){ //doSomeThing } } }
正如咱们上边讲的,若是线程调用wait()、join()、sleep()后再调用interrupt()方法,会清空中止状态并抛异常InterreptedException。使用这个方法也能够中止线程,其实与第一个差很少,我以为。
调用sleep(long million)或者sleep(long millis,int nans)可使调用方法的线程休眠指定时间,方法可能抛出InterruptedException和IllegalArgumentException,源码以下:
//使当前线程休眠指定毫秒:1秒=1000毫秒 public static native void sleep(long millis) throws InterruptedException; /** *使线程休眠指定毫秒+纳秒,其实精确不了纳秒的级别: * 1.若是纳秒参数>500,000则休眠时间增长1毫秒(至关于向上取整); * 2.若是毫秒参数为0并且纳秒参数不为0,则休眠1毫秒; * 3.纳秒级别的参数不能超过1毫秒,即999,999; * 1ms=1000,000ns(纳秒) * **/ public static void sleep(long millis, int nanos) throws InterruptedException { if (millis < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (nanos < 0 || nanos > 999999) {//纳秒级别的参数不能超过1毫秒 throw new IllegalArgumentException( "nanosecond timeout value out of range"); } if (nanos >= 500000 || (nanos != 0 && millis == 0)) { millis++; } sleep(millis); }
方法源码以下,若是当前线程正在运行或者准备运行都会返回true:
public final native boolean isAlive();
public static native Thread currentThread();