多线程基础(二)

一:守护线程

      ① 什么是守护线程?

          守护线程指的是服务线程,是专门为其它线程(用户线程)服务的,当主线程停止了,守护线程也会被停止。

      ② 守护线程与用户线程的区别?

          java中有两种线程,一个是守护线程,一个是用户线程。守护线程指的是服务线程,比喻垃圾回收机制就是一个典型的服务线程,而用户线程就是应用程序自定义的线程。当主线程停止了,用户线程还会继续运行,而守护线程主线程停止了,守护线程也就停止了。

       ③ 守护线程案例

/**
 * 守护线程案例
 * 
 * @Title DaemonTest01
 * @Description
 * @Company
 * @author Zheng.Zeng
 * @date 2018年6月12日 下午4:47:06
 */
public class DaemonTest01 {
    public static void main (String[] args) {
        DaemonThread daemonThread = new DaemonThread ();
        // 设置线程为守护线程
        daemonThread.setDaemon (true);
        daemonThread.start ();
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep (100);
            } catch (Exception e) {

            }
            System.out.println ("主线程");
        }
        System.out.println ("主线程执行完毕!");
    }
}

class DaemonThread extends Thread {
    @Override
    public void run () {
        while (true) {
            try {
                Thread.sleep (100);
            } catch (Exception e) {
            }
            System.out.println ("子线程...");
        }
    }
}

执行结果


也有可能出现一下情况,可能有些人就会疑问这是为什么了。其实道理很简单,因为守护线程这时候已经在执行中了,正好主线程这个时候停止了。这时候这个正在执行的守护线程会执行完毕之后才会停止守护线程。


二:join()方法

作用:让其他线程变为休眠状态,直到当前线程执行完毕了释放资源之后,其他线程才能执行

案例:

/**
 * join方法案例
 * 
 * @Title JoinTest01
 * @Description
 * @Company
 * @author Zheng.Zeng
 * @date 2018年6月12日 下午5:21:38
 */
public class JoinTest01 {
    public static void main (String[] args) {
        JoinThread joinThread = new JoinThread ();
        Thread t01 = new Thread (joinThread);
        Thread t02 = new Thread (joinThread);
        t01.start ();
        try {
            // 让其他线程等待t01执行完毕才执行t02
            t01.join ();
        } catch (InterruptedException e) {
        }
        t02.start ();
    }
}

class JoinThread implements Runnable {
    @Override
    public void run () {
        for (int i = 0; i < 10; i++) {
            System.out.println (Thread.currentThread ().getName () + "i:" + i);
        }
    }
}

结果


三:优先级

在操作系统中,线程可以划分优先级,优先级较高的线程得到CPU资源较多,也就是CPU优先执行优先级较高的线程对象中的任务(其实并不是这样)。在Java中,线程的优先级用setPriority()方法就行,线程的优先级分为1-10这10个等级,如果小于1或大于10,则抛出异常throw new IllegalArgumentException(),默认是5。

案例:

/**
 * 优先级案例
 * 
 * @Title PriorityTest
 * @Description
 * @Company
 * @author Zheng.Zeng
 * @date 2018年6月12日 下午5:35:23
 */
public class PriorityTest {
    public static void main (String[] args) {
        PriorityThread priorityThread = new PriorityThread ();
        Thread thread1 = new Thread (priorityThread);
        Thread thread2 = new Thread (priorityThread);
        thread1.start ();
        //注意设置了优先级, 不是每次都会执行。 而是CPU调度才会分配
        thread1.setPriority (10);
        thread2.start ();
    }
}

class PriorityThread implements Runnable {

    @Override
    public void run () {
        for (int i = 0; i < 10; i++) {
            System.out.println (Thread.currentThread ().getName () + "i:" + i);
        }
    }

}

结果 


也有可能为以下结果 道理请理解以上逻辑


猜你喜欢

转载自blog.csdn.net/qq_35165004/article/details/80667228