JAVA学习总结-多线程基础: (2)

3.2,就绪状态(Runnable):当线程对象调用了start();该线程处于就绪状态;并没有开始运行,只是表明该线程可以运行了,至于什么时候开始运行,取决于JVM里的线程调度器的调度.

注意:这里不能直接调用run();否则系统把线程对象当作普通对象,run()当成普通方法,而不是线程执行体.

 

3.3,运行状态(Running:就绪状态的线程获取了CPU,执行run()的线程执行体.

 

3.4,阻塞状态(Blocked:阻塞状态是线程因为某种原因放弃CPU使用权;暂时停止运行。直到线程进入就绪状态.才有机会转到运行状态.阻塞的情况分三种:

(一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中;(wait()会释放持有的锁);

(二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中;

(三)、其他阻塞:运行的线程执行sleep()join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态,sleep()状态超时,join()等待线程终止或者超时,或者I/O处理完毕时,线程重新转入就绪状态;(注意:sleep()是不会释放持有的锁).

 

3.5,死亡状态(Dead):run(),call()执行完,或抛出未捕获异常,该线程结束生命周期。

/**为了测试某个线程是否死亡,可以调用线程对象的isAlive(),当线程处于,就绪,运行,阻塞状态时返回ture,在新建和死亡状态时返回false*/

 

4.控制线程;

4.1,守护线程

当程序中只剩下守护线程时,他会自杀;

JVM的垃圾回收线程就是守护线程;

调用ThreadsetDaemon(true);可以将指定线程设置成守护线程.

注意:要将某个线程设置成守护线程,必须在该线程启动之前,start()调用之前.

 

4.2,线程睡眠

通过调用Threadstatic方法sleep()让当前的线程进入暂停一段时间,进入阻塞状态.

 

4.3,线程让步

yield()方法也是Threadstatic方法,他不会使该线程进入阻塞状态,只是转入就绪状态,完全有可能的是:当某个线程调用了yield()暂停之后,线程调度器又将其调度出来重新执行;

注意:只有优先级和当前线程相同或者比当前线程更高的处于就绪状态的线程才会获得执行的机会.

4.4,改变线程优先级

每个线程执行时都有一定的优先级,优先级高的线程获得较多的执行机会,而优先级较低的线程则获得较低的执行机会,;默认情况下main线程具有优先级,main线程创建的子线程也具有优先级;

Thread类提供了setPriority(int newPriority);getPriority();方法来改变和获取线程的优先级,范围在1-10之间.

 

4.5,join()线程

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzfsz.html