zoukankan      html  css  js  c++  java
  • 多线程基础(四)线程控制

    系列目录

    线程控制

    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);
                }
            }
        }
    
    }
    
    
    
  • 相关阅读:
    软件需求分析
    行高line-height 和vertical-align
    python中的集合基础知识
    python中字典常用的函数和用法
    python中字符串常用的函数
    day-75CRM
    day-74CRM
    day73CRM
    day-72Django源码解析
    day-71Django补充
  • 原文地址:https://www.cnblogs.com/juzhuxiaozhu/p/12761838.html
Copyright © 2011-2022 走看看