线程的基本操作

学习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资源的争夺。

posted @ 2018-03-06 17:35  胖胖的猛犸  Views(140)  Comments(0)    收藏  举报