java线程调度及相关函数(代码片段)

流楚丶格念 流楚丶格念     2022-12-06     365

关键词:

文章目录

Java线程调度

线程调度

  • 抢占式调度模型:
    那个线程的优先级比较高,抢到的CPU时间片的概率就高一些/多一些。
    java采用的就是抢占式调度模型

  • 均分式调度模型:
    平均分配CPU时间片。每个线程占有的CPU时间片时间长度一样。
    平均分配,一切平等。
    有一些编程语言,线程调度模型采用的是这种方式。

相关方法

线程实例方法:

void setPriority(int newPriority); 	// 设置线程的优先级
int getPriority(); 					// 获取线程优先级

注意:

  • 最低优先级1
  • 默认优先级是5
  • 最高优先级10

优先级比较高的获取CPU时间片可能会多一些。(但也不完全是,大概率是多的)。

void join();			// 让一个线程等待另一个线程完成的方法

当在某个程序执行流中调用其他线程的join()方法时,调用线程将被阻塞,直到被join()方法加入的join线程执行完为止。

join()方法通常由使用线程的程序调用,以将大问题划分成许多小问题,每个小问题分配一个线程。当所有的小问题都得到处理后,再调用主线程来进一步操作。

线程类静态方法:

static void yield(); 		// 让位方法

暂停当前正在执行的线程对象,并执行其他线程

yield()方法不是阻塞方法。让当前线程让位,让给其它线程使用。yield()方法的执行会让当前线程从“运行状态”回到“就绪状态”。

注意:在回到就绪之后,有可能还会再次抢到,然后过了很短时间就又运行了,所以可能会出现看起来像没调用yield()一样。

代码案例

设置线程优先级

package com.yyl.threadTest;

class MyThread extends Thread 
    @Override
    public void run() 
        // 获取线程优先级
        //System.out.println(Thread.currentThread().getName() + "线程的默认优先级:" + Thread.currentThread().getPriority());
        for (int i = 0; i < 10000; i++) 
            System.out.println(Thread.currentThread().getName() + "-->" + i);
        
    


public class ThreadScheduling 
    public static void main(String[] args) 
        // 设置主线程的优先级为1
        Thread.currentThread().setPriority(1);

        // 获取当前线程对象,获取当前线程的优先级
        Thread currentThread = Thread.currentThread();

        Thread t = new Thread(new MyThread());
        t.setPriority(10);
        t.setName("t");
        t.start();

        // 优先级较高的,只是抢到的CPU时间片相对多一些。
        // 大概率方向更偏向于优先级比较高的。
        for (int i = 0; i < 10000; i++) 
            System.out.println(Thread.currentThread().getName() + "-->" + i);
        

        // 最高优先级:10
        // 最低优先级:1
        // 默认优先级:5
        System.out.println("最高优先级:" + Thread.MAX_PRIORITY);
        System.out.println("最低优先级:" + Thread.MIN_PRIORITY);
        System.out.println("默认优先级:" + Thread.NORM_PRIORITY);
    


调用yield暂停当前线程

package com.yyl.threadTest;

class MyThread extends Thread 
    @Override
    public void run() 
        for(int i = 1; i <= 10000; i++) 
            //每100个让位一次。
            if(i % 100 == 0)
                Thread.yield(); // 当前线程暂停一下,让给主线程
            
            System.out.println(Thread.currentThread().getName() + "--->" + i);
        
    


public class ThreadScheduling 
    public static void main(String[] args) 
        Thread t = new Thread(new MyThread());
        t.setName("t");
        t.start();

        for(int i = 1; i <= 10000; i++) 
            System.out.println(Thread.currentThread().getName() + "--->" + i);
        
    

rt-thread--内核基础(代码片段)

...核库、实时内核实现。实时内核的实现包括:对象管理、线程管理及调度器、线程间通信管理、时钟管理及内存管理等等,内核最小的资源占用情况是3KBROM,1.2KBRAM。 线程调度线程是RT-Thread操作系统中最小的调度单位,线程... 查看详情

threadx内核源码分析-定时器及线程时间片调度(arm)(代码片段)

1、线程时间片介绍(tx_thread_time_slice)ThreadX内核同优先级线程之间是按时间片调度的,tx_thread_new_time_slice记录线程的时间片(一次调度的总的时间片),tx_thread_time_slice记录线程的剩余时间片(ThreadX内核每次调度线程时,并... 查看详情

rt-thread嵌入式操作系统相关的问题(代码片段)

...的问题RT-thread操作系统调度器的实现细节RT-Thread中提供的线程调度器是基于优先级的全抢占式调度:在系统中除了中断处理函数、调度器上锁部分的代码和禁止中断的代码是不可抢占的之外,系统的其他部分都是可以抢占的,包... 查看详情

kotlin协程硬核解读(6.协程调度器实现原理)(代码片段)

...ontinuationInterceptor续体拦截器1.2Dispatchers调度器2.协程的3次线程调度2.1第一次线程调度:切换到指定线程开始执行协程代码2.2第二次线程调度:切换线程执行异步挂起函数2.3第三次线程调度:异步挂起函数执行完毕后将... 查看详情

kotlin协程硬核解读(6.协程调度器实现原理)(代码片段)

...ontinuationInterceptor续体拦截器1.2Dispatchers调度器2.协程的3次线程调度2.1第一次线程调度:切换到指定线程开始执行协程代码2.2第二次线程调度:切换线程执行异步挂起函数2.3第三次线程调度:异步挂起函数执行完毕后将... 查看详情

多线程(代码片段)

多线程一、线程简介1.Process与Thread程序-----(运行)------>进程---------->线程一个进程中包含若干个线程,线程是CPU调度和执行的单位mian即主线程线程是独立的执行路径程序运行时,即使自己没有创建线程,后台也会有多个线程-... 查看详情

10操作系统——线程的相关属性(代码片段)

目录一、线程调度1、三种调度算法(1)SCHED_FIFO(先进先出的排队方式调度)(2)SCHED_RR实时调度策略,时间片轮转(3)SCHED_OTHER分时调度策略(linux默认) 2、pthread_attr_setschedpolicy/pthre... 查看详情

java多线程的基本使用(代码片段)

文章目录1.多线程的概念2.线程的实现方式2.1继承Thread类实现多线程2.2实现Runnable接口实现多线程2.3实现Callable的多线程1.多线程的概念在程序执行的时候,即使没有开启多线程,Java后台也有多个线程在运行,最基本的... 查看详情

纯干货!二十八道batj大厂java岗之"多线程与并发"面试题分享(代码片段)

...可能会懵逼的面试真题,有需要的可以看下~一、进程与线程进程是资源分配的最小单位,线程是cpu调度的最小单位。线程也被称为轻量级进程。所有与进程相关的资源,都被记录在PCB中进程是抢占处理及的调度单位;线程属于... 查看详情

kotlin协程硬核解读(6.协程调度器实现原理)(代码片段)

...ontinuationInterceptor续体拦截器1.2Dispatchers调度器2.协程的3次线程调度2.1第一次线程调度:切换到指定线程开始执行协程代码2.2第二次线程调度:切换线程执行异步挂起函数2.3第三次线程 查看详情

java中thread类及常见方法(代码片段)

...及常见方法1.Thread的常见构造方法2.Thread的常见属性3.启动线程4.中断线程4.1.通过共享的标记来进行沟通4.2.调用interrupt方法来通知5.等待线程6.获取线程引用7.休眠线程8.线程让出资源Thread类时JVM中用来管理线程的一个类,也就... 查看详情

线程定时调度(代码片段)

具体参见JDK文档:https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Timer.html packagethreadStudy;importjava.util.Timer;importjava.util.TimerTask;publicclassTimerTestextendsTimerTask 查看详情

线程(嵌入式学习)(代码片段)

线程知识精简概念定义线程私有属性进程和线程区别函数创建线程退出线程回收线程获取线程ID线程分离案例线程同步概念同步机制特性函数线程互斥概念函数死锁条件变量(和互斥锁搭配使用实现同步)步骤函数概念线... 查看详情

任务调度之timer与timertask配合(代码片段)

...务,对这些任务进行管理,就是任务调度。任务调度与多线程密切相关。 任务调度有多种方式Timer与TimerTask配合Timer定时器,能在主线程外另起线程完成任务。TimerTask实现Runnable接口的抽象类,相当于一个任务。 来一个简... 查看详情

[rtt]rt-thread线程调度机制线程切换时机(代码片段)

1.问题最初接触RTT时,对于线程切换时机的相关概念主要来自以下几个方面:RTT在创建线程时,需要输入线程的时间片参数,时间片的单位为OSTick。线程休眠函数rt_thread_delay()、设置软件定时器、以及一些如信号量... 查看详情

java多线程总结(代码片段)

1.多线程开发又叫JUC开发(java.util.concurrent),至少5年以上才能涉及到,面试阿里常问2.线程和进程有什么区别?1)进程是资源(CUP,内存)分配的最小单位,线程是程序执行的最小单位。2)一个程序至少有一个进程,一个进程... 查看详情

java多线程-线程调度及获取和设置线程优先级

线程有两种调度模型:1、分时调度模型所有线程轮流使用CPU的使用权,平均分配给每个线程占用CPU的时间片。2、抢占式调度模型优先让给线程高的线程使用CPU,如果线程的优先级相同,那么随机选择一个,优先级高的线程获取... 查看详情

arraylist函数及相关解释(代码片段)

Java中ArrayList是使用对象数组实现的,默认的数组容量为10。在ArrayList中,默认创建了两个空的对象数组,一个用户该对象的空实例,一个用于当第一个元素被添加的时候,该数组要被填充多少。同时,该类... 查看详情