如何停止线程?
过去用stop不过现在已经过时
我们知道。开启多线程运行,运行代码通常是循环结构
所以只要控停止循环,就可以让run方法结束,也就是线程结束
特殊情况是:
当线程处于了冻结状态,
线程由于处于冻结状态,并读不到标记,那么线程就不会结束
当没有指定的方式让冻结的线程恢复到运行状态中来的时候,就需要对冻结进行解除!
解决是:
Thread类提供了该方法 interrupt();
该方法可以解除wait(),sleep();join()
- class Test implements Runnable
- {
- private boolean flag = true;
- //public void run()不加同步,没有changeFlag()方法,就只有线程0和线程1在交替执行,死循环,,,没有到main线程
- //public void run()不加同步,有changeFlag()方法,线程0和线程1,mian线程交替执行。正常结束
- public synchronized void run()//加上同步,其实只有一个线程在运行run()里面的内容,threa0和main线程交替,正常结束
- //因为线程同步。里面又是条件总是满足的循环(直到changeFlag()执行)
- {
- while(flag)
- {
- try
- {
- wait();//看下面的分析
- }
- catch (InterruptedException e)
- {
- System.out.println(Thread.currentThread().getName()+"**exception");
- flag = false;
- }
- System.out.println(Thread.currentThread().getName()+"...run");
- }
- }
- public void changeFlag()
- {
- flag = false;
- }
- }
- class InterruptThread
- {
- public static void main(String[] args)
- {
- Test t = new Test();
- Thread t1 = new Thread(t);
- Thread t2 = new Thread(t);
- t1.start();
- t2.start();
- int num =0;
- while(true)
- {
- if(num++ == 6000)
- {
- t1.interrupt();
- t2.interrupt();
- //t.changeFlag();
- break;
- }
- System.out.println(Thread.currentThread().getName()+num);
- }
- }
- }
- /*解析:
- //run()方法同步,拥有changeFlag()功能,且有wait()操作,这时候,即使有changeFlag().无法正常结束
- //因为Thread0执行,判断flag(true),进入wait状态,(重点)然后释放锁,thread1获得执行
- //thread1执行,判断flag(true),进入wait状态,此时thread0和thread1都处于wait(冻结)状态。
- //两个线程都是一开始就被wait了,还没来得及知道flag的值已经变化
- //也就是说,两个线程都已是wait状态,即使后来改变了flag的值,因为冻结在那里,无法动,仍无法正常结束
- 怎样才能正常结束?
- 方法一(自己想的,哈哈)
- 这时候就需要interrupt()强行唤醒wait。先打破wait状态,在改变flag的值就可以正常结束
- 在main线程中的这几行代码即可
- if(num++ == 6000)
- {
- t1.interrupt();
- t2.interrupt();
- t.changeFlag();
- break;
- }
- 方法二:
- 还是先打破wait状态,然后在catch中将flag直接赋值false
- run()里面:
- catch (InterruptedException e)
- {
- System.out.println(Thread.currentThread().getName()+"**exception");
- flag = false;
- }
- mian线程:
- if(num++ == 6000)
- {
- t1.interrupt();
- t2.interrupt();
- break;
- }
- 其实都一样,都是先打破wait,然后或者在catch处理的时候将置flag为false
- 或者在mian里面单独处理!
- */
复制代码
|
|