一.停止线程
1.标记停止线程
原有的stop和suspend方法存在固有的安全性问题,尤其是suspend有死锁倾向。
public class StopThread implements Runnable{
private boolean flag = true;
@Override
public void run() {
while(flag){
System.out.println(Thread.currentThread()+"...run...");
}
}
public void changeFlag(){
this.flag = false;
}
public static void main(String[] args) {
StopThread st = new StopThread();
Thread t0 = new Thread(st);
Thread t1 = new Thread(st);
t0.start();
t1.start();
int num = 1;
for(;;){
if(++num==50){
st.changeFlag();
break;
}
System.out.println("main..."+num);
}
System.out.println("over");
}
}
在代码中让线程进入冻结状态,这种方法有停不下来的时候。
2.interrupt方法结束线程
可以使用interrupt方法将线程从冻结状态强制恢复到运行状态,让线程具备cpu执行资格。但是这种操作是强制性的,会造成InterruptedException,需要进行处理,如在本例中的读取标记。
public class StopThread implements Runnable{
private boolean flag = true;
@Override
public synchronized void run() {
while(flag){
try{
wait();
} catch (InterruptedException e) {
System.out.println(Thread.currentThread()+e.toString());
flag = false;
}
System.out.println(Thread.currentThread()+"...run...");
}
}
public void changeFlag(){
this.flag = false;
}
public static void main(String[] args) {
StopThread st = new StopThread();
Thread t0 = new Thread(st);
Thread t1 = new Thread(st);
t0.start();
t1.start();
int num = 1;
for(;;){
if(++num==50){
t0.interrupt();
t1.interrupt();
break;
}
System.out.println("main..."+num);
}
System.out.println("over");
}
}
二.守护线程
守护线程又称为用户线程或者后台线程,它的创建和运行状态和其它线程一样,但是只要前台线程(系统线程)全部结束,那么无论守护线程处于何种状态都自动结束。当一个正在运行的java程序内所有的线程都为守护线程时,jvm退出。
public class StopThread implements Runnable{
private boolean flag = true;
@Override
public synchronized void run() {
while(flag){
try{
wait();
} catch (InterruptedException e) {
System.out.println(Thread.currentThread()+e.toString());
flag = false;
}
System.out.println(Thread.currentThread()+"...run...");
}
}
public void changeFlag(){
this.flag = false;
}
public static void main(String[] args) {
StopThread st = new StopThread();
Thread t0 = new Thread(st);
Thread t1 = new Thread(st);
t0.start();
t1.setDaemon(true);
t1.start();
int num = 1;
for(;;){
if(++num==50){
t0.interrupt();
break;
}
System.out.println("main..."+num);
}
System.out.println("over");
}
}