1.sleep和wait的区别?
1.sleep必须指定时间,wait可以指定可以不指定。
2.sleep和wait都可以让线程处于冻结状态,释放执行权。(相同点)
3.持有锁的线程执行sleep,不释放锁,持有锁的线程执行到wait释放锁。
4.sleep到时间会自动醒,wait没有指定时间,只能被其他线程通过notify唤醒。
2.如何让线程走向消亡
一是线程的任务没了,二是stop()是强制停止线程,但是会有风险.java提供的两种方法
1.线程任务中定义循环语句:只要定义变量控制住循环。就可以控制线程的结束
2.interrupt方法
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; } } 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 = 0; while(true){ if(num++ == 50){ st.setFlag();//当条件满足时,将线程任务中的标记改为false。让线程停止。 break; } System.out.println(Thread.currentThread().getName()+"....."+num); } System.out.println("over"); } }
class StopThread implements Runnable{ private boolean flag = true; public synchronized void run (){ 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 setFlag(){ flag = 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 = 0; while(true){ if(num++ == 50){ //对t1进行一次中断,意思是将t1的冻结状态清除。让其恢复执行资格。 t1.interrupt(); t2.interrupt(); break; } System.out.println(Thread.currentThread().getName()+"....."+num); } System.out.println("over"); } }
不是所有的程序能用的notify(), interrupt()是强制清除等待状态。
3.setDaemon
public final void setDaemon(boolean on)
将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,也就是没有前台线程运行的时候,Java 虚拟机退出。
调用该方法必须在启动线程前调用。
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.setDaemon(true);//将t2标记成守护线程(后台线程) t2.start(); int num = 0; while(true){ if(num++ == 50){ //对t1进行一次中断,意思是将t1的冻结状态清除。让其恢复执行资格。 t1.interrupt(); break; } System.out.println(Thread.currentThread().getName()+"....."+num); } System.out.println("over"); } }
Thread-1不论处于什么状态,都会自动停止。
4.join
public final void join() throws InterruptedException
等待该线程终止。
class Demo implements Runnable{ private String name; Demo(String name){ this.name = name; } public void run(){ for(int x=0; x<20; x++){ System.out.println(Thread.currentThread().getName()+"...."+x+"...."+name); } } } class ThreadDemo_Join { public static void main(String[] args) throws Exception{ Demo d1 = new Demo("小强"); Demo d2 = new Demo("旺财"); Thread t1 = new Thread(d1); Thread t2 = new Thread(d2); t1.start(); t1.join(); //主线程等待t1线程终止。主线程立刻释放执行权,没了执行资格,等t1执行终止后,主线程再继续执行 t2.start(); //t1.join(); //放在这行,cpu从执行t2切换到执行t1.join()的时候.这时候,t2和main都要等t1结束了 for(int x=0; x<20; x++){ System.out.println("main......"+x); } } }
时间: 2024-10-12 20:13:25