黑马程序员技术交流社区
标题:
停止线程练习与分析
[打印本页]
作者:
itheima_llt
时间:
2015-4-10 23:52
标题:
停止线程练习与分析
/**
停止线程
原理:让run方法结束。而run方法中通常定义循环结构,所以就是控制住循环结构就可以了。
stop方法已经过时了。
如何控制循环结构??
1 定义结束标记
2 当线程处于了冻结状态,没有执行标记,程序一样无法结束。
这时可以循环,正常退出冻结状态,或者强制结束冻结状态。
强制结束冻结状态:interrupt();目的是线程强制从冻结状态恢复到运行状态。
但是会发生InterruptedException异常。
*/
/*
//1 定义结束标记结束线程
class StopThread implements Runnable
{
boolean flag = true;//定义标记控制循环结构
//覆盖run方法
public void run()
{
while(flag)
{
System.out.println(Thread.currentThread().getName()+"...run");//打印调用run方法的线程名
}
}
//改变标记
public void changeFlag()
{
flag = false;
}
}
class StopThreadDemo
{
public static void main(String[] args)
{
StopThread st = new StopThread();//建立实现了Runnable接口的类的对象
Thread t1 = new Thread(st);//建立线程1
Thread t2 = new Thread(st);//建立线程2
t1.start();//启动线程1,调用run方法
t2.start();//启动线程2,调用run方法
//定义一个循环,等线程1和线程2运行一会儿之后,主线程再把标记flag改为false
int num = 0;
while(true)
{
if(num++ == 50)
{
st.changeFlag();//改变run方法中while循环的标记
break;//改变标记后,立刻结束主线程的while循环
}
System.out.println(Thread.currentThread().getName()+"......run"+num);//展示主线程执行的结果
}
System.out.println("over");//表示主线程执行完毕
}
}
*/
/*
部分运行结果:
Thread-0...run
Thread-0...run
Thread-1...run
Thread-0...run
main......run50
Thread-0...run
Thread-1...run
over
从控制台中,可以看到,当主线程运行while循环50次后,
就从while循环中跳出来,并执行结束了。
而且线程1和线程也结束了。
*/
/*
下面看一下当线程处于冻结状态时候如何结束线程
*/
/*
class StopThread implements Runnable
{
boolean flag = true;//定义标记控制循环结构
//覆盖run方法,注意只有在同步中才可以使用wait
public synchronized void run()
{
while(flag)
{
try
{
wait();
}
catch (InterruptedException e)
{
System.out.println(Thread.currentThread().getName()+"...异常");
flag = false;//中断线程的冻结状态后,立即改变标记,结束循环,结束run,结束线程
}
System.out.println(Thread.currentThread().getName()+"...run");//打印调用run方法的线程名
}
}
}
class StopThreadDemo
{
public static void main(String[] args)
{
StopThread st = new StopThread();//建立实现了Runnable接口的类的对象
Thread t1 = new Thread(st);//建立线程1
Thread t2 = new Thread(st);//建立线程2
t1.start();//启动线程1,调用run方法
t2.start();//启动线程2,调用run方法
//定义一个循环,等线程1和线程2运行一会儿之后,主线程再把标记flag改为false
int num = 0;
while(true)
{
if(num++ == 50)
{
t1.interrupt();//强制清楚线程1的冻结状态
t2.interrupt();//强制清楚线程1的冻结状态
break;//改变标记后,立刻结束主线程的while循环
}
System.out.println(Thread.currentThread().getName()+"......run"+num);//展示主线程执行的结果
}
System.out.println("over");//表示主线程执行完毕
}
}
*/
/*
public synchronized void run()
{
while(flag)
{
try
{
this.wait();
}
catch (InterruptedException e)
{
}
System.out.println(Thread.currentThread().getName()+"...run");//打印调用run方法的线程名
}
}
在把run方法改为上面这样的时候,运行结果显示:
线程1和线程2一调用run方法就陷入冻结状态。
而且,直到主线程结束,它们也没有结束。
对此,我们利用interrupt方法来强制中断线程的冻结状态。
总结:
特殊情况:
当线程处于了冻结状态。
就不会读取到标记。那么线程就不会结束。
当没有指定的方式让冻结的线程恢复到运行状态是,这时需要对冻结进行清除。
强制让线程恢复到运行状态中来。这样就可以操作标记让线程结束。
Thread类提供该方法 interrupt();
*/
/*
守护线程
又名用户现场,后台线程。
setDaemon(boolean):将线程标记为后台线程,后台线程和前台线程一样,开启,一样抢执行权运行,
只有在结束时,有区别,当前台线程都运行结束后,后台线程会自动结束。
该方法在start前调用。
把前面结束线程的例子改动一下。
*/
/*
class StopThread implements Runnable
{
boolean flag = true;//定义标记控制循环结构
//覆盖run方法,
public void run()
{
while(flag)
System.out.println(Thread.currentThread().getName()+"...run");//打印调用run方法的线程名
}
}
class StopThreadDemo
{
public static void main(String[] args)
{
StopThread st = new StopThread();//建立实现了Runnable接口的类的对象
Thread t1 = new Thread(st);//建立线程1
Thread t2 = new Thread(st);//建立线程2
t1.setDaemon(true);//标记线程1为后台线程
t2.setDaemon(true);//标记线程2为后台线程
t1.start();//启动线程1,调用run方法
t2.start();//启动线程2,调用run方法
//定义一个循环,等线程1和线程2运行一会儿之后,主线程再把标记flag改为false
int num = 0;
while(true)
{
if(num++ == 50)
{
break;//改变标记后,立刻结束主线程的while循环
}
System.out.println(Thread.currentThread().getName()+"......run"+num);//展示主线程执行的结果
}
System.out.println("over");//表示主线程执行完毕
}
}
*/
/*
运行结果
Thread-0...run
Thread-1...run
main......run50
Thread-1...run
Thread-0...run
Thread-1...run
over
Thread-1...run
结果显示:当主线程结束之后,线程1和线程2立刻结束了
*/
复制代码
作者:
itheima_llt
时间:
2015-4-12 21:57
笔记要天天做啊
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2