多线程基础(四)线程控制

系列目录

线程控制

1.join

/**
 * 此案例用于演示Join方法
 * 某线程中,join了其他线程,本线程需等待(被阻塞)其他线程处理完毕才能执行
 *
 *
 *
 */
public class JoinThread extends Thread {
    public JoinThread(String name){
        super(name);
    }
    @Override
    public void run(){
        for(int i=0;i<100;i++){
            System.out.println(getName()+" "+i);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        for(int i=0;i<100;i++){
            if(i==20){
                JoinThread jt = new JoinThread("被join的线程");
                jt.start();
                jt.join();
            }
            System.out.println(Thread.currentThread().getName()+" "+i);
        }
    }
}

2.后台线程

后台线程又称为守护线程、精灵线程。
与之对应的是:前台线程、被守护线程。

  • 特点:当所有前台线程结束后,后台也会随之结束;
    后台线程也可以在前台线程之前结束。
  • 常见的后台线程:
    GC:垃圾回收器
  • 前台线程:
    Main线程
  • 实现方式:
    在需要成为守护线程的线程对象上调用setDaemon方法,
    把当前线程设置成了守护线程。

【案例】

package myThread;

/**
 * 此案例用于演示后台线程。
 * 一旦所有前台线程运行完,后台线程就自行结束了
 *
 * 注:
 * 1.前台线程创建的子线程默认为前台线程,后台线程创建的子线程默认为后台线程
 * 2.设置后台线程需要在启动线程之前
 */
public class DaemonThread extends Thread{

    @Override
    public void run(){
        for(int i=0;i<100;i++){
            System.out.println(getName()+" "+i);
        }
    }
    public static void main(String[] args) {
        DaemonThread daemonThread = new DaemonThread();
        daemonThread.setDaemon(true);
        daemonThread.start();
        for(int i=0;i<10;i++){
            System.out.println(Thread.currentThread().getName()+" "+i);
        }
    }
}

3.线程睡眠 sleep()

与yield方法的区别:

  • sleep进入阻塞,yield进入就绪。
  • sleep方法暂停线程后,处理机不会理会争抢线程的优先级。
    yield方法只会给相同及更高优先级的线程执行机会。
  • yield不会抛出异常。
  • sleep方法有更好的移植性,不推荐后者.

4.线程优先级

一般而言,操作系统设置了1-10个等级,默认等级5,数字越大,等级越高。
但为了避免差异,最好使用Thread类的三个即静态常量:

  • MAX_PRIORITY=10
  • MIN_PRIORITY=1
  • NORM_PRIORITY=5

注意:
调整优先级,只是调整抢占CPU的概率,但是不能保证一定是优先级高的执行。

【案例】

package myThread;

public class PriorityTest extends Thread{
    public PriorityTest(String name){
        super(name);
    }
    @Override
    public void run(){
        for(int i=0;i<100;i++){
            System.out.println(getName()+" 当前优先级是:"+getPriority()+",当前遍历数是:"+i);
        }

    }

    public static void main(String[] args) {
        Thread.currentThread().setPriority(6);
        for(int i=0;i<30;i++){
            if(i==10){
                PriorityTest low = new PriorityTest("低级");
                low.start();
                System.out.println(low.getName()+"创建之初的优先级为:"+low.getPriority());
                low.setPriority(MIN_PRIORITY);
            }
            if(i==20){
                PriorityTest high = new PriorityTest("高级");
                high.start();
                System.out.println(high.getName()+"创建之初的优先级为:"+high.getPriority());
                high.setPriority(MAX_PRIORITY);
            }
        }
    }

}


posted @ 2020-04-23 16:39  仰观云  阅读(138)  评论(0编辑  收藏  举报
Live2D