java并发编程的艺术-(1)

1. isInterrupted()线程是否标记中断

这个方法只有他的调用者是当前执行这句代码本身的线程对象时,才会得到正确的结果,所以常常在线程内部的run方法里使用。

例如: 在线程 1 中调用 线程2.isInterrupted();是会返回false的,但者不是线程2真正的状态。只有在线程2的内部调用 线程2.isInterruted();才会得到正确结果。

2. 不要使用 stop() 来强制停止一个线程

stop()停止线程,会导致一些资源被释放,或者数据一致性方面的问题

– 异常法

而应该使用 interrupt();标志这个线程应该中止 ,然后在线程内部 用

if( this.isInterrupted( ) ){

throw new InterruptException();

} 并且try catch起来,安全的停止线程;

– sleep法

当一个线程同时遇到 interrupt() 和 sleep() 方法时,就会在后执行的这个方法时,抛出 InterruptException(); 并且将线程 的中止状态 重置为 false。

– return 法

使用 interrupt();标志这个线程应该中止 ,然后在线程内部 用

if( this.isInterrupted( ) ){

return ;

}

3.使用 suspend() 方法来阻塞暂停

要注意被暂停线程所持有的锁是不被释放的,也就是可能造成阻塞

可以使用 resume( );来继续

使用stop(); 方法来暴力中止线程的时候,会释放线程所占用的锁。

4. yield()方法

Thread.yield() ; 让当前执行的线程暂时放弃cpu 时间片的资源,让给其他线程争抢。

但是很有可能刚刚被放弃,马上又获得cpu时间片。

5.线程的优先级

线程规划器 根据线程的优先级来分配线程使用cpu的权重。

myThread.setPriority(5); 可选值 [1-10 ] ,main线程默认5.

大部分情况下高优先级线程是先于低优先级线程执行的,但是也具有随机性。

6.守护线程 setDaemon(true)

守护线程一旦开启,只会在jvm所有非守护线程都停止时才会结束

MyThread5 myThread5 = new MyThread5();
myThread5.setDaemon(true);
myThread5.start();
Thread.sleep(6000);
System.out.println("main线程执行完毕停止,守护线程也会自动停止。");

经验分享 程序员 微信小程序 职场和发展