线程相关知识[2]

一、线程方法

1.1 start():启动线程

start():作用是启动一个新的线程,但start()方法不能重复调用

public synchronized void start() {
        if (threadStatus != 0)
            throw new IllegalThreadStateException();
 
       //线程组概念。已经被线程池替代
        group.add(this);
 
        boolean started = false;
        try {
            start0();
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
            }
        }
    }
 
    private native void start0();

start方法启动子线程是通过调用native的系统提供的方式来启动线程

1.2 run():子线程执行体

作用是将所有的子线程业务逻辑在run方法中实现,在调用start方法时,会启动子线程并自动调用到run方法。不需要显性调用。
单独调用run()方法,会在当前线程中执行run()方法,并不会启动新线程

1.3 yield():线程让步

作用:是暂停当前的线程的执行,并让步于其他同优先级或更高优先级线程,让其他线程先执行

public static native void yield();

方法特点:

1、yield方法是Thread类的静态方法,通过Thread.yield()调用
2、能够让正在执行的线程由“运行状态”进入到“就绪状态”,等待CPU调度。
3、正在执行线程让步于相同优先级或更高优先级的线程来获取CPU执行权,当同级优先级或者更高优先级没有对应线程时,当前线程又可以继续执行

1.4 sleep():线程休眠

作用:让线程休眠,哪个线程调用sleep方法,哪个线程休眠

public static native void sleep(long millis) throws InterruptedException;
 
public static void sleep(long millis, int nanos) throws InterruptedException {
        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }
 
        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }
 
        if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
            millis++;
        }
 
        sleep(millis);
    }

sleep方法有两个,分别是sleep(long millis)和sleep(long millis, int nanos),两个方法功能一样,第二个方法提供了纳秒级的时间控制

特点:
1、sleep方法是静态的native方法,调用Thread.sleep()调用
2、sleep方法调用会使当前线程从“运行状态”进入到“睡眠状态”,直到给定的时间millis,当前线程才会被唤醒
3、sleep方法会使线程休眠到指定的时间,如果要提前终止休眠,可以通过Interrupt方法调用,会使当前的sleep方法抛出InterruptedException异常,结束掉休眠

1.5 join():线程合并

作用:暂停当前线程,等待子线程执行结束当前线程才能执行。join方法让并行的线程合并为串行的线程执行

例如:a线程中执行代码b.join()方法,则a线程会停止当前执行,并让b线程线执行,直到b线程执行结束,a线程才继续执行

//指定合并等待时间
public final synchronized void join(long millis) throws InterruptedException {
        long base = System.currentTimeMillis();
        long now = 0;
 
        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }
 
        if (millis == 0) {
            while (isAlive()) {
                wait(0);
            }
        } else {
            while (isAlive()) {
                long delay = millis - now;
                if (delay <= 0) {
                    break;
                }
                wait(delay);
                now = System.currentTimeMillis() - base;
            }
        }
    }
 
 //指定毫秒、纳秒界别的合并时间
    public final synchronized void join(long millis, int nanos) throws InterruptedException {
 
        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }
 
        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }
 
        if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
            millis++;
        }
 
        join(millis);
    }
 
    //会一直等待直到子线程执行结束
    public final void join() throws InterruptedException {
        join(0);
    }

方法特点:
1、线程方法提供了三种方法join(long millis)、join(long millis, int nanos)和join()方法,都是调用了join(long millis)的实现
2、join方法定义在Thread类中,可以抛出InterruptedException异常,即join方法是可以被中断合并
3、join方法调用会使线程状态从“运行状态”进入到“阻塞状态”
4、join方法可以使线程按照顺序串行执行

1.6 Interrupt():中断线程

作用:中断当前线程,中断处于阻塞状态的线程

方法:

boolean isInterrupted()  //返回值:true:当前线程被中断  false:当前线程未被中断
void interrupt();        //发起中断操作 是Thread类中的普通方法,由对象调用该方法

源码实现:

public void interrupt() {
        if (this != Thread.currentThread())
            checkAccess();
 
        synchronized (blockerLock) {
            Interruptible b = blocker;
            if (b != null) {
                interrupt0();           // Just to set the interrupt flag
                b.interrupt(this);
                return;
            }
        }
        interrupt0();
    }
private native void interrupt0(); //底层操作系统提供中断业务

方法说明:
中断操作interrupt()方法底层调用的是native的interrupt0()方法,发起中断操作仅仅修改中断标志位
1、如果当前的线程处于阻塞状态(sleep、join、wait等方法会导致线程进入阻塞状态),在任意的其他线程调用Interrupt()方法,那么线程会立即抛出一个InterruptedException退出阻塞状态
2、如果当前的线程处于运行状态,其他线程调用Interrupt方法,当前线程继续运行,直到发生了阻塞之后随后会立即抛出异常跳出阻塞

1.7 daemon():守护线程

方法介绍:

void setDaemon(boolean on)  //设置守护线程, 参数Boolean类型 true:设置为守护线程 false:非守护线程 默认是false
  boolean isDaemon()  //判断当前线程是否为守护线程

守护线程:
Java中有两种线程,用户线程(非守护线程)守护线程通过isDaemon方法进行区分,如果返回是false:说明线程是用户线程,否则是”守护线程“
用户线程一般用户执行用户级的任务
守护线程也称之为”后台线程“,服务于用户线程,一般执行后台任务,例如:垃圾回收的线程是单独线程来处理的,负责垃圾回收的线程就是守护线程

线程生命周期:
守护线程是依赖于用户线程,当用户线程存在时,守护线程就会存活,当没有了用户线程时,那么守护线程也就会随之消亡

1.8 Priority:线程优先级

用来指导线程的执行优先级的,指的是用来告诉CPU哪些线程优先被执行
方法介绍:

void setPriority(int newPriority) //设置当前线程的优先级,newPriority必须是1~10之间的整数,否则会抛出异常
int getPriority() //获取当前线程的优先级
 public final static int MIN_PRIORITY = 1; //最小优先级
 public final static int NORM_PRIORITY = 5;//默认优先级
 public final static int MAX_PRIORITY = 10;//最大优先级

优先级的特点:
1、Java的线程的优先级并不是绝对的,其控制的是执行的机会,优先级高的线程被执行的概率比较大,而优先级低的线程也并不是没有机会,只是执行的概率相对低一些
2、Java线程的优先级一共10个级别,分别为1-10,数值越大,表明优先级越高,一个普通的线程,其优先级为5(即为默认优先级)

二、线程调度

2.1 方法级调度

Java线程中提供的一些方法可以进行线程的调度,合理的线程方法使用,可以充分发挥系统的性能,提高程序的执行效率

1.线程的优先级:高优先级线程获得较多的运行机会
2.线程睡眠:sleep(),让当前线程从运行状态进入到阻塞状态
3.线程让步:yield(),让正在执行的线程从运行状态进入就绪状态
4.线程合并:join(),当前调用join方法的线程进入到运行状态
5.线程等待:wait(),会使线程从运行状态进入到等待状态

2.2 系统级调度

主要指系统在特定的时机自动进行调度,主要涉及调度算法

  • FIFO:先进先出算法
  • SJF:最短作业优先算法
  • SRTF:最短剩余时间优先算法
  • RR(Round Robin):时间片轮转算法
  • HPF(Higest Priority First):最高优先级算法

OS系统调度算法一般都是基于时间片的优先级算法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值