JAVA学习(停止线程,守护线程,join方法)
一、停止线程
1.stop方法,类Thread的方法,已经过时,该方法具有固有的不安全性,使用该方法来终止线程将释放它锁定的的所有监视器,该方法是强制性的。
2.run方法结束。线程的任务没有了,线程自动就结束了。
如何控制线程的任务结束:
任务中都会有循环结构,只要控制住循环就可以结束任务。
控制循环通常就用定义标记来完成。
但是如果线程处于冻结状态,无法读取标记,如何结束。
例如:
public class StopThread implements Runnable{ private boolean flag = true; //定义标记 public void run(){ while(flag){ System.out.println(Thread.currentThread().getName()+"run"); } } public void setFlag (){ //定义方法修改定义标记 flag = false; } } public class MarkDemo { 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 =0; for (int x=0;x<999999999;x++){ System.out.println(x); if(++num==20000){ st.setFlag(); break; } } } }
3.interrupt中断线程
可以使用interrupt()方法将线程从冻结状态强制恢复到运行状态,让线程具备CPU执行资格。
但是该强制动作会发生InterruptedException,记得要处理。
例如:
public class StopThread implements Runnable{ private boolean flag = true; public void run(){ while(flag){ try{ wait(); //开启线程后执行run方法后,进入冻结状态。 } catch (InterruptedException e) { System.out.println(Thread.currentThread().getName() + "...."+e); flag = false; //使用interrupt方法消除冻结后,捕捉异常,执行方法,此时修改定义标记,将run方法结束循环,线程自动结束。 } System.out.println(Thread.currentThread().getName()+"......+++++"); } } public void setFlag (){ flag = false; } } public class MarkDemo { 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 =0; for (int x=0;x<999999999;x++){ System.out.println(x); if(++num==20000){ t1.interrupt(); //消除t1的冻结状态 t2.interrupt(); //消除t2的冻结状态 break; } } System.out.println("over"); } }
二、守护线程setDaemon (后台进程)
只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。
三、join方法
join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行。在A线程中调用了B线程的join()方法时,表示只有当B线程执行完毕时,A线程才能继续执行。
join()方法可以传入参数,参数代表A线程中调用B线程的join方法时,A线程等待B线程的时间。单位是毫秒。