❒ 有三种方式可以停止线程
✔ 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
public class ServerThread extends Thread {
// volatile修饰符用来保证其它线程读取的总是该变量的最新的值
public volatile boolean exit = false;
@Override
public void run() {
ServerSocket serverSocket = new ServerSocket(8080);
while(!exit){
serverSocket.accept(); // 阻塞等待客户端消息
}
}
public static void main(String[] args) {
ServerThread t = new ServerThread();
t.start();
t.exit = true; // 修改标志位,退出线程
}
}
✔ 使用stop方法强行终止(不推荐,方法已作废)
▣ 调用stop()方法会立刻停止run()方法中剩余的全部工作,包括在catch或finally语句中的,并抛出ThreadDeath异常(通常情况下此异常不需要显示的捕获),因此可能会导致一些清理性的工作的得不到完成,如文件,数据库等的关闭。
▣ 调用stop()方法会立即释放该线程所持有的所有的锁,导致数据得不到同步,出现数据不一致的问题。
✔ 使用interrupt方法中断线程
▣ 打断阻塞的线程(sleep,wait,join)的线程,线程会抛出InterruptedException异常
▣ 打断正常的线程,可以根据打断状态来标记是否退出线程