文章目录
1. 关于进程
进行是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
线程是轻量级的进程,是程序执行的最小单位。
2.线程的基本知识
2.1 线程的创建
线程创建可以 new 一个线程对象,调用该对象的start()方法,如下
Thread t1 = new Thread();
t1.start();
可以继承Thread类或者实现Runnable抽象类。
2.2 终止线程
stop()方法已经被废弃。
该方法会强行把执行到一半的线程终止,可能会引起一些数据不一致的问题。
2.3 线程中断
线程中断的方法
public void Thread.interrupt() //中断线程
public boolean Thread.isInterrupted() //判断是否被中断
public static boolean Thread.interrupted() //判断是否被中断,并清除当前中断状态
Thread.sleep()方法会抛出InterruptedException异常,同时会清除中断标记。
2.4 等待(wait)和通知(notify)
两个方法不再Thread类中,而是在Object类中。
当在一个对象实例上调用wait()方法后,当前线程就会在这个对象上等待。线程会一直等到其他线程调用该对象的notify()方法为止。
wait()方法必须包含在对应的synchronzied语句中,无论是wait()或者notify()都需要首先获得目标对象的一个监视器。
注意:wait()方法在执行后,会释放目标对象的锁,而sleep()方法调用后,不会释放任何资源
2.5 挂起(suspend)和继续执行(resume)
suspend()和resume()两个方法是被标注为废弃方法,是由于suspend()方法调用时,线程被挂起后,不会释放任何锁资源,直到对应的线程上进行了resume()操作。如线程A在run()方法内调用了Thread.currentThread().suspend()方法,则A线程不会释放任何锁资源,直到其他位置调用了A.resume()方法。而且resume()方法必须在suspend()后执行,否则锁资源会一直不被释放。而且调用suspend()的线程状态还是RUNNABLE状态。
2.6 等待线程结束(join)和谦让(yield)
在一个线程中调用另外一个线程的join()方法,表示等待另外一个线程结束。如在A线程中调用B.join(),表示A线程等待B线程执行完毕,跟着B线程一起向后执行。其实调用join()方法,就是使调用线程wait()在线程上。
Thread B = new Thread();
B.start();
Thread A = new Thread(){
public void run(){
B.join();
}
};
A.start();
yield()方法会让出CPU,会重新抢夺。