停止线程,守护线程, join方法

2018-03-17  本文已影响0人  发光驴子

停止线程

 /*
  * 
  * 停止线程
  * 线程的停止:
     1. 停止一个线程 我们一般都会通过一个变量去控制的。线程的停止,并不是直接杀死线程,而是让线程中的任务执行完毕
     2. 如果需要停止一个处于等待状态下的线程,那么我们需要通过变量配合notify方法或者interrupt()来使用。
  * 
  * */
 class Demo extends Thread{

     boolean flag=true;
     public Demo(String name){
         super(name);
     }

     public synchronized void run(){
         int i=0;
         while(flag){
             try {
                 this.wait();
             } catch (InterruptedException e) {
                 // TODO Auto-generated catch block
                 //e.printStackTrace();
                 System.out.println("接收到了异常");
             }
        
             System.out.println(Thread.currentThread().getName()+":"+i);
             i++;
         }
     }
 }

 public class Thread_08 {

     public static void main(String[] args){
         Demo d=new Demo("线程1");
         d.setPriority(10);//这是设置线程的优先级 ,线程的优先级是1-10
         d.start();//开启线程
    
         for(int i =0; i<100;i++){
             System.out.println(Thread.currentThread().getName()+":"+i);
             if(i==90){//当i=90的时候停止线程
                 //d.interrupt();  // interrupt()根本就是无法停止一个线程。
                 d.flag=false;
                 //d.interrupt();//把线程的等待状态强制清楚,被清除状态的线程会接收到一个InterruptedException
                 synchronized (d) {
                     d.notify();
                 }
             }
         }

     }

 }

守护线程

/*
 * 守护线程(后台线程):在一个进程中如果只剩下了 守护线程,那么守护线程也会死亡。(就是主线程结束后,守护线程没有完成任务也会死亡)
 * 一个线程默认的都不是守护线程
 * */

class Demo10 extends Thread{
    public Demo10(String name){
        super(name);
    }
    public void run(){
        for (int i = 0; i <1000; i++) {
            System.out.println(this.getName()+":"+i);
        }
    }

}
public class Thread_09 {
    public static void main(String[] args) {
        Demo10 d=new Demo10("后台线程");
        d.setDaemon(true);//设置线程是否为守护线程,true为守护线程,false为非守护线程
        //System.out.println(d.isDaemon());;isDaemon()查看线程是否为守护线程
        d.start();
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName());
        }
    }

}

join方法

/*
 * 线程的join方法
 * 一个线程如果执行join语句,那么就有新的线程加入,执行该语句的线程必须要让步给新加入的线程先完成任务,然后才能继续执行。
 *join(millis); 等待millis 毫秒终止线程,假如这段时间内该线程还没执行完,那么结束等待,2个线程并发执行
 * */

class Mom extends Thread{
    public Mom(String name){
    
        super(name);
    }

    public  void run(){
        System.out.println("妈妈洗菜");
        System.out.println("妈妈切菜");
        System.out.println("妈妈准备炒菜,发现没有酱油了。。");
        //叫儿子去打酱油
        Son s=new Son();
        s.start();
        try {
            s.join();//加入。 一个线程如果执行join语句,那么就有新的线程加入,执行该语句的线程必须要让步给新加入的线程先完成任务,然后才能继续执行。
            //s.join(10);
        } catch (InterruptedException e) {
        // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("妈妈继续炒菜");
    
        System.out.println("一起吃饭");
    
    }
}

class Son extends Thread{
    @Override
    public void run() {
        System.out.println("儿子下楼");
        try {
            this.sleep(1000);//睡眠1000毫秒
        } catch (InterruptedException e) {
        // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("儿子一直往前走");
        System.out.println("儿子打完酱油了");
        System.out.println("上楼,把酱油给给妈妈");
    }
}

public class Thread_10 {

    public static void main(String[] args) {
        Mom mom=new Mom("妈妈");
        mom.start();
    }


}
上一篇 下一篇

猜你喜欢

热点阅读