对于线程的停止,我们不能用stop方法,已经过时,也可能会导致死锁问题,在API是这样说的
方法具有固有的不安全性。用 Thread.stop 来终止线程将释放它已经锁定的所有监视器(作为沿堆栈向上传播的未检查 ThreadDeath 异常的一个自然后果)。如果以前受这些监视器保护的任何对象都处于一种不一致的状态,则损坏的对象将对其他线程可见,这有可能导致任意的行为。stop 的许多使用都应由只修改某些变量以指示目标线程应该停止运行的代码来取代。目标线程应定期检查该变量,并且如果该变量指示它要停止运行,则从其运行方法依次返回。如果目标线程等待很长时间(例如基于一个条件变量),则应使用 interrupt 方法来中断该等待。
/*线程的停止:stop方法已经过时了,那么只能是当线程的任务代码执行完线程自然结束
任务代码中通常都有循环,所以只要让循环停下来线程就能停下来
*/
class Test implements Runnable
{
boolean flag = true;
public synchronized void run()
{
while(flag)
{
//线程进入等待状态,为了让线程结束,只能强制结束线程的等待状态
try{
wait();
}
catch(InterruptedException e)
{
e.printStackTrace();
flag = false;
}
System.out.println(Thread.currentThread().getName()+".....Hello World!");
}
}
}
class practice7
{
public static void main(String[] args)
{
Test test = new Test();
Thread t1 = new Thread(test);
Thread t2 = new Thread(test);
//t2.setDaemon(true);
t1.start();
t2.start();
try{Thread.sleep(20);}catch(InterruptedException e){e.printStackTrace();}
int i=1;
while(true)
{
if(i++==500)
//如果只设计这种方式,若遇到wait还会出问题
//test.flag = false;
//这两个进程必须都产生中断,抛出异常才能被接收停止
//t2设置为守护进程时,当t1停止,t2也就停止了
t1.interrupt();
//t2.interrupt();
break;
}
}
}
}
这里简单说明一下守护进程
//守护线程:可以看成是后台线程,依赖于前台线程,当前台线程全部结束时,即使后台线程的任务代码没有执行完
// 也会立刻结束
线程的Join()方法
这里不多说明,代码简单说明一下
//join():加入运行
class Test implements Runnable
{
public void run()
{
for(int i=1;i<=10;i++)
{
System.out.println(Thread.currentThread().getName()+"---->"+i);
}
}
}
class Demo9
{
public static void main(String[] args)throws InterruptedException
{
Test test = new Test();
Thread t1 = new Thread(test);
Thread t2 = new Thread(test);
t1.start();
//t1.join();//让t1线程加入运行,这时只有主线程和t1线程,所以主线程会等待t1线程全部执行完再执行
t2.start();
t1.join();//有主线程和t1,t2线程,主线程会等待t1线程执行完,t2不会让着t1
for(int i=1;i<=10;i++)
{
System.out.println(Thread.currentThread().getName()+"---->"+i);
}
}
}