没想到这么快就再续前缘!那么现在在听我来分解:
16.停止线程
由于安全问题stop()已经被停用。所以停止线程就只能让线程执行的代码结束,也即将run方法执行完,线程自动结束。
解决方案:让run结束。run方法中通常有循环(因为如果没有循环,则执行语句相对简单,用单线程就可以,没必要启用多线程)。那么我们只要使用标记控制循环即可:将控制循环语句改为变量而避免使用常量即可【while(flag)】。
定义标记可以解决线程的中止问题,但是如果在多线程中,主线程先行执行结束,而其他线程都被wait而进入冻结状态,此时没有进程去signal或者notify他们。进而无法执行进程的结束标记,此时如果没有正确的像sleep时间到等恢复机制则会出现进程假死无法结束的情况。解决方法:
使用Thread的中断interrupt():即说强制将调用此方法的进程的冻结状态中断。让线程恢复到具备执行资格的阻塞状态中来。因为只有让线程恢复到运行状态才可能执行到标记,进而才能结束循环,去结束线程。由于这种方式不是正常方式让线程结束冻结,故会抛出异常(interruptedException)。而且为避免返回执行时进程再次进入冻结状态,则在catch异常中操作标记将进程结束掉。
17.守护线程
Thread中
void |
setDaemon(boolean on) |
在一个多线程程序中如果仅剩下守护线程,则jvm自动退出,也就是将自动将守护线程结束。
Thread中
void |
join() |
void |
join(long millis) |
void |
join(long millis, int nanos) |
调用这个方法的线程,实际上就是临时突然向cpu申请执行(就是既要执行权又要执行资格)。主线程必须要等使用join()方法的线程执行完成后才能和其他线程竞争cpu的执行。整个过程中并不影响其他线程的运行状态。或者讲join只是main和被调用此方法的线程二者之间的关系。
19.toString()方法:返回调用此方法线程的名字、优先级、进程组。
20.setPriority()方法:设置调用此方法的线程的优先级(MAX_PRIORITY 10、MIN_PRIORITY NORM_PRIORITY 1)
21. yield()方法【Thread.yield();】:static void的, 使用此方法将很和谐。因为执行的线程碰到这个方法后将交出自己执行权,让其他线程执行,他将进入阻塞状态。
附:附件中为线程状态图有助于理解这篇博文。