java线程中join方法原理,以及守护线程的使用

原创
2015/08/23 22:16
阅读数 231

1:先讲下join方法的作用: 调用join的线程可以使得其他线程等待自己运行结束,其他线程才会继续开始运行。

2:线程分为两类,用户线程和守护线程。用户线程就是比较常见的主线程、以及我们普通的后台任务处理线程。而守护线程则是为用户线程服务,比如 Eclipse里持续检测内存的使用情况等等。当时守护线程有个重要特点就是 当用户线程运行结束,守护线程会立即结束,无论守护线程里的人物是否执行完毕。

守护线程是用过给一个普通线程设置   setDaemon(true)实现。

下边给出具体代码:

MyThread.java 普通线程,用来测试join方法

package com.company;

class MyThread extends Thread{

    public MyThread(String name)
    {
        super(name);
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " start");
        for (int i=0; i < 50; ++i)
        {
            System.out.println(Thread.currentThread().getName() + " output #"+ i);
            try {
                sleep(500);//这里的延时是为了能使效果更明显
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        System.out.println(Thread.currentThread().getName() + " end");
    }
}

 

 DaemonThread.java   守护线程类

package com.company;

/**
 * Created by renjingwei on 2015/8/23.
 */
public class DaemonThread extends Thread {

    public DaemonThread(String name) {
        super(name);
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " start");
        for (int i = 0; i < 1000; ++i) {
            System.out.println(Thread.currentThread().getName() + " output #" + i);
            try {
                sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        System.out.println(Thread.currentThread().getName() + " end");
    }
}

 

Main.java

package com.company;

public class Main {

    public static void main(String[] args) {

        System.out.println(Thread.currentThread().getName() + " get start!!!");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        /*****
        注释的几行演示 线程的join用法: 调用线程会使得其他线程等待自己完成后  其他线程才会继续执行
//        MyThread thread = new MyThread("MyThread");
//        thread.start();
//
//        try {
//            thread.join();
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
        /*********************************//



        /******************************************
        //主线程的守护线程,在主线程结束后,守护线程会立即停止
        DaemonThread daemonThread = new DaemonThread("DaemonThread");
        daemonThread.setDaemon(true);
        daemonThread.start();

        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
         *****************************/



        System.out.println(Thread.currentThread().getName() + " end!!!!!");


    }


}

 

运行结果,这里列举,挺长的。简单说下

join()的使用:MyThread在主线程上调用了join,此时 主线程就会等待MyThread执行完毕才会继续执行主线程的代码。

 

守护线程的使用: DeamonThread设置为主线程的守护线程,可以从log中看出,在主线程结束后,DaemonThread立即就结束了。

 

 

 

 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部