本编继续介绍java线程操作中的挂起,继续执行,等待结束和谦让操作
挂起(suspend)和继续执行(resume)
这是两个被标注的废弃的方法,原因如下:
* suspend()方法在迫使当前正在执行的线程的暂停的时候,并不会去释放锁
* 如果resume()意外的在suspend()之前被执行了,那么被挂起的线程很可能就永远不可能再执行了
关于第二个问题,示例代码如下:
public class SuspendAndResume {
static class Task implements Runnable{
@Override
public synchronized void run() {
System.out.println(Thread.currentThread().getName()+"开始执行");
Thread.currentThread().suspend();
System.out.println(Thread.currentThread().getName()+"恢复执行");
}
}
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new Task());
Thread t2 = new Thread(new Task());
t1.start();
Thread.sleep(1000);
t2.start();
t1.resume();
//这个resume会在t2的suspend之前执行,造成t2执行suspend后就一直处于被挂起的状态而没有被恢复
t2.resume();
}
}
运行的结果如下:
这里就是因为线程2在suspend之前执行了resume,导致后面在执行suspend的时候已经没有resume调用了,导致线程2一直没有被再次执行,程序也一直没有结束
等待线程结束(join)和谦让(yield)
很多的时候,一个线程的输入可能非常依赖于另一个或多个线程的输出,此时这个线程就需要等待依赖的线程执行完毕,才能继续执行,这就是join操作
public final void join()
没有参数的join表示无线等待,会一直阻塞当前线程,直到目标线程执行完毕
public final synchronized void join(long millis)
带参数的join表示,会最多等待指定的时间,如果超过给定的时间,当前线程会不在继续等待,继续执行下面的代码
public static native void yield();
yield方法,一旦执行会让当前线程让出CPU,但是让出CPU不表示当前线程不再执行了,而是当当前线程退出后,还会与其它线程一起重新竞争CPU资源