Java之路--Javase篇 多线程(2)

没想到这么快就再续前缘!那么现在在听我来分解:   

16.停止线程

由于安全问题stop()已经被停用。所以停止线程就只能让线程执行的代码结束,也即将run方法执行完,线程自动结束。

解决方案:让run结束。run方法中通常有循环(因为如果没有循环,则执行语句相对简单,用单线程就可以,没必要启用多线程)。那么我们只要使用标记控制循环即可:将控制循环语句改为变量而避免使用常量即可【while(flag)】。

 定义标记可以解决线程的中止问题,但是如果在多线程中,主线程先行执行结束,而其他线程都被wait而进入冻结状态,此时没有进程去signal或者notify他们。进而无法执行进程的结束标记,此时如果没有正确的像sleep时间到等恢复机制则会出现进程假死无法结束的情况。解决方法:

使用Thread的中断interrupt():即说强制将调用此方法的进程的冻结状态中断。让线程恢复到具备执行资格的阻塞状态中来。因为只有让线程恢复到运行状态才可能执行到标记,进而才能结束循环,去结束线程。由于这种方式不是正常方式让线程结束冻结,故会抛出异常(interruptedException)。而且为避免返回执行时进程再次进入冻结状态,则在catch异常中操作标记将进程结束掉。

 

17.守护线程

Thread中

void

setDaemon(boolean on) 
          Marks this thread as either a daemon thread or a user thread.

 在一个多线程程序中如果仅剩下守护线程,则jvm自动退出,也就是将自动将守护线程结束。

  

 

18 join方法

Thread中

void

join() 
          Waits for this thread to die.

 void

join(long millis) 
          Waits at most millis milliseconds for this thread to die.

 void

join(long millis, int nanos) 
          Waits at most millis milliseconds plus nanos nanoseconds for this
 thread to die.

调用这个方法的线程,实际上就是临时突然向cpu申请执行(就是既要执行权又要执行资格)。主线程必须要等使用join()方法的线程执行完成后才能和其他线程竞争cpu的执行。整个过程中并不影响其他线程的运行状态。或者讲join只是main和被调用此方法的线程二者之间的关系。

 

 

19.toString()方法:返回调用此方法线程的名字、优先级、进程组。

 

 

20.setPriority()方法:设置调用此方法的线程的优先级(MAX_PRIORITY 10、MIN_PRIORITY NORM_PRIORITY 1)

 

21. yield()方法【Thread.yield();】:static void的, 使用此方法将很和谐。因为执行的线程碰到这个方法后将交出自己执行权,让其他线程执行,他将进入阻塞状态。

 

附:附件中为线程状态图有助于理解这篇博文。

    

你可能感兴趣的:(java,多线程,职场,休闲)