进程与线程
操作系统运行一个程序时,会为其创建一个进程,而一个进程又可以创建多个线程,所以线程是操作系统调度的最小单位。进程有独立的地址空间和自己的一整套变量,而线程没有单独的地址空间,但是有自己的堆栈和局部变量,线程之间共享数据。
Java 中多线程实现
Java 中有三种创建多线程的方法:
- 通过继承 Thread 类;
- 通过实现 Runnable 接口;
- 通过 Callable 和 Future 实现;
示例:
继承 Thread 类创建线程
public class ExtendsThread extends Thread {
@Override
public void run() {
System.out.println("Thread extends Thread");
}
}
实现 Runnable 接口创建线程
public class ImplRunnable implements Runnable {
@Override
public void run() {
System.out.println("Thread implements Runnable");
}
}
启动进程:
public class StartThread {
public static void main(String[] args) {
ExtendsThread et = new ExtendsThread();
et.start();//启动线程
ImplRunnable r = new ImplRunnable();
Thread rt = new Thread(r);
rt.start();//启动线程
}
}
中断线程
当线程的 run 方法执行方法体中最后一条语句后,并经由 return 语句返回后,或者出现方法中没有捕获的异常时,线程将中止。在早期 Java 版本中其他进程可以调用 stop() 方法来中止进程,但是该方法已经被弃用。
没有强制终止线程的方法,但是,interrupted 方法可以用来请求终止进程。每个线程都有一个 boolean 类型的中断状态标志位,调用 interrupted 方法,线程的中断状态将被置位。可以调用静态的 Thread.currentThread 方法获得当前线程,然后调用 isInterrupted 方法来判断该进程的中断状态是否被置位。
但是如果在阻塞进程(wait 或者 sleep)进程上调用 interrupted 方法,将会被 Interrupted Exception 异常中断。
线程状态
线程有如下六种状态
- New (新创建)
- Runnable (可运行)
- Blocked (被阻塞)
- Waiting (等待)
- Time waiting (计时等待)
- Terminated (被终止)
New:new 操作符新建一个进程时,意味着它的状态位 New。
Runnable:一旦调用 start() 方法,线程就处于 Runnable 状态。一个 Runnable 状态的进程可能正在运行,也有可能没有运行,取决于操作系统。
Blocked ,Waiting & Time waitting:当进程处于 Blocked ,Waiting 和 Time waiting 状态时,它不运行任何代码且消耗最少的资源。线程会因为如下原因被阻塞或等待:
- 当一个线程试图获得另一个内部的对象锁,而该锁被其他进程持有,则该进程进入阻塞状态;
- 当一个线程等待另一个线程通知调度器一个条件时,它将进入等待状态 ;
- 调用具有超时参数的方法进入计时等待状态(Time waiting)
Terminated:线程会因为如下两个原因而被终止:
- run 方法正常退出;
- 因为一个没有捕获的异常而终止 run 方法而被终止;
参考资料: