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线程执行完毕停止,守护线程也会自动停止。");
