当开启一个线程后我们怎么去停止它呢?停止线程的方法:
1、stop方法(已过时)
2.、run方法结束,当run方法中的任务代码执行完后,线程自动结束
怎么控制线程的任务结束呢? 任务中都会有循环结构(让线程重复执行代码),只要控制住循环就可以结束任务,结束线程。
控制循环通常就用定义标记来完成。下例:
class StopThread implements Runnable
{
private boolean flag=true; //初始化标志位为true
public void run()
{
while(flag)
{
System.out.println(Thread.currentThread().getName()+"...");
}
}
public void setFlag()
{
flag=false; //改变标志位的值为false
}
}
class StopThreadDemo
{
public static void main(String[] args)
{
StopThread st=new StopThread();
Thread t1=new Thread(st);
Thread t2=new Thread(st);
t1.start();
t2.start();
int num=1;
for(;;)
{
if(++num==50)
{
st.setFlag();
break;
}
System.out.println("main..."+num); //表示main函数即主线程的运行
}
System.out.println("over");
}
}
运行结果:
当我们改变run方法的代码时,即让线程等待:
public synchronized void run()
{
while(flag)
{
try
{
wait();
}
catch(InterruptedException e)
{
System.out.println(Thread.currentThread().getName()+"..."+e);
}
System.out.println(Thread.currentThread().getName()+"...");
}
}
运行结果:
发现程序并没有停止,这是因为线程t1、t2处于等待状态。
但是如果线程处于了冻结状态,无法读取标记,如何结束呢?
可以使用interrupt()方法将线程从冻结状态强制恢复到运行状态中来,让线程具备cpu的执行资格。但是强制动作会发生InterruptedException(中断异常),所以要处理。interrupt():清除线程的冻结状态,让线程恢复具备cpu的执行资格的状态。改写上例:
class StopThread implements Runnable
{
private boolean flag=true; //初始化标志位为true
public synchronized void run()
{
while(flag)
{
try
{
wait();
}
catch(InterruptedException e)
{
System.out.println(Thread.currentThread().getName()+"..."+e);
flag=false; //结束线程
}
System.out.println(Thread.currentThread().getName()+"...");
}
}
public void setFlag()
{
flag=false; //改变标志位的值为false
}
}
class StopThreadDemo
{
public static void main(String[] args)
{
StopThread st=new StopThread();
Thread t1=new Thread(st);
Thread t2=new Thread(st);
t1.start();
t2.start();
int num=1;
for(;;)
{
if(++num==50)
{
//st.setFlag();
t1.interrupt();
t2.interrupt();
break;
}
System.out.println("main..."+num); //表示main函数即主线程的运行
}
System.out.println("over");
}
}
运行结果:
引申:守护线程
如果我们将代码中的t2.interrupt()去掉,那么线程t2将不会结束,程序也就不会结束,这时我们可以将t2定义为守护线程,守护线程运行在后台,当前台的线程全部运行结束后,守护线程自动消失。它依附于前台线程存在。
在main函数中这样定义:
public static void main(String[] args)
{
StopThread st=new StopThread();
Thread t1=new Thread(st);
Thread t2=new Thread(st);
t1.start();
t2.setDaemon(true); //线程t2定义为守护线程
t2.start();
int num=1;
for(;;)
{
if(++num==50)
{
//st.setFlag();
t1.interrupt();
//t2.interrupt();
break;
}
System.out.println("main..."+num); //表示main函数即主线程的运行
}
System.out.println("over");
}
运行结果: