线程基本操作
1.线程创建
创建线程的几种方式
2.线程终止
Thread.stop()方法,是一个被标注为废弃的方法,原因是stop()方法过于暴力,强行把执行到一半的线程终止,可能会引起一些数据不一致的问题。stop()方法在结束线程时,会直接终止线程,并立即释放这个线程所持有的锁,而这些锁是用来维持对象一致性的。
3.线程中断
线程中断并不会使线程立即退出,而是给线程发送一个通知,告诉目标线程,有人希望你退出了,至于目标线程接到通知后如何处理,则完全由目标线程自行决定。
有三个方法与线程中断有关:
1.Thread.interrupt() 中断线程,会通知目标线程中断,就是设置中断的标志位,中断标志位表示当前线程已经被中断了
2.Thread.isInterrupted() 判断当前线程是否被中断,检查中断标志位
3.Thread.interrupted() 判断是否被中断,并清除当前中断状态
4.线程休眠
Thread.sleep()方法,让当前线程休眠millis毫秒的时间,会抛出InterruptedException中断异常,它不是运行时异常,所以程序必须捕获并处理它。当前线程休眠时,如果被中断,这个异常就会产生。
它常常配合中断来使用,sleep()方法由于中断而抛出异常,这时它会清除中断标记,如果不加处理,在下一次循环开始时就无法捕获这个中断,所以在异常处理中,再次设置中断标记位。
5.线程等待和通知
Object.wait()方法,当在一个对象实例上调用wait()方法后,当前线程就会在这个对象上等待。比如,在线程A中,调用了obj.wait()方法,那么线程A就会停止继续执行,转为等待状态,线程A会一直等到其他线程调用了obj.notify()方法为止。
如果一个线程调用了object.wait()方法,那么它就会进入object对象的等待队列,这个等待队列中,可能会有多个线程,因为系统运行多个线程同时等待某一个对象。当obj.notify()方法被调用时,它就会从这个等待队列中随机选择一个线程,并将其唤醒。要是调用的是obj.notifyAll()方法,它会唤醒在这个等待队列中所有等待的线程。
Object.wait()和Thread.sleep()比较:
两者都可以让线程等待若干时间,但wait()方法可以别唤醒,并且wait方法会释放目标对象的锁,而sleep方法不会释放任何资源。
6.线程挂起和继续执行
Thread.suspend()和Thread.resume(),它们也是废弃方法,因为suspend()方法在导致线程暂停的同时,不会释放任何锁资源,会发生死锁。如果resume()在suspend()前执行,被挂起的线程可能很难有机会被继续执行。
7.等待线程结束和谦让
Thread.join()有两个方法,无参的表示无限等待,它会一直阻塞当前线程,直到目标线程执行完毕。有时间参数的表示最大等待时间,如果超过给定时间目标线程还在执行,当前线程会继续往下执行。join方法就相当于插队,现在有线程t1正在执行,然后执行t2.join()会让t2插队去执行,若是无时间等待,则要等t2执行完才能让t1恢复执行,若是有时间等待,则等时间结束后t2没有结束,也会让t1继续执行。
join()方法的本质是,让调用线程wait()方法在当前线程对象实例上。
Thread.yield()方法,执行后它会使当前线程让出CPU,让出CPU后,它还是会进行CPU资源的争夺,能否被再次分配到就不一定了。如果觉着一个线程不那么重要,或者优先级比较低时,就可以适当调用Thread.yield()方法,给其他重要线程更多的工作机会。