线程的基本操作
学习java并发,过程中的一些知识点做下记录,以备查看。
1.1 新建线程
新建线程很简单,只需要使用创建线程对象并将它start()起来即可。
Thread t1 = new Thread();
t1.start();
start()方法会新建一个线程,并让这个线程调用执行Thread的run()方法
下面的代码也能编译通过并执行,但是并不能创建新的线程,只是当前线程中的一个普通方法的调用。
Thread t1 = new Thread();
t1.run();
1.2 终止线程
一般来说线程执行完毕就会结束,无需手动关闭。
基于业务的实现,可以调用Thread的stop()方法手动终止线程.
stop()方法被标注废弃不推荐使用,原因是stop()方法太过暴力,强行把执行一半的线程终止,容易造成一些数据的不一致问题。
如果需要终止一个线程,由我们自行决定线程何时退出就可以了。具体实现可以在run()方法入口增加是否需要退出标志位,根据标志判断是否退出线程。
1.3 线程中断
严格的讲,线程中断并不会使线程立即退出,而是给线程发送一个通知,告知目标线程,有人希望你退出啦!
至于目标线程收到通知后如何处理,完全由目标线程自行决定。
线程中断常用的三个方法:
public void Thread.interrupt(); // 中断线程
public boolean Thread.isInterrupted(); // 判断是否被中断
public static boolean Thread.interrupted(); // 判断是否被中断,并清除当前中断状态
sleep()方法会让线程休眠,当线程在休眠时如果被中断会产生InterruptedException异常,此时它会清除中断标记。
安全的做法是在捕获InterruptedException异常时,再次设置中断标志位。
1.4 等待和通知
等待方法wait()和通知方法notify()并不是在Thread类中,而是输出Object类。这也意味着任何对象都可以调用这两个方法。
如果一个线程调用了object.wait(),那么它就会进入object对象的等待队列,这个等待队列中可能存在多个线程。当object.notify()被调用时,它就会从这个等待队列中随机选择一个线程,并将其唤醒。
Object.wait()方法并不是可以随便调用的,它必须包含在synchronzied语句中,无论是wait()还是notify()都需要首先获得目标对象的一个监视器。
Object.wait()和Thread.sleep()方法都可以让线程等待若干时间。除了wait()可以被唤醒外,另外一个主要区别就是wait()方法会释放目标对象的锁,而Thread.sleep()方法不会释放任何资源。
1.5 挂起和继续执行
挂起suspend()和继续执行resume()是一对相反的操作,已被标注为废弃。
suspend()在挂起线程时不会释放任何锁资源。
1.6 等待线程结束和谦让
join():当一个线程的输入非常依赖另一个线程的输出的时候,这个线程就需要等待依赖的线程执行完毕。
yield():静态方法,一旦执行,它会是当前线程让出CPU。但是让出CPU不代表该线程不再执行。线程让出CPU后仍然会进行CPU资源的争夺。

浙公网安备 33010602011771号