Java线程调度及相关函数

Posted 杨 戬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java线程调度及相关函数相关的知识,希望对你有一定的参考价值。

文章目录

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);
        
    

以上是关于Java线程调度及相关函数的主要内容,如果未能解决你的问题,请参考以下文章

Java面试题 | 线程池原理及调度过程1

纯干货!二十八道BATJ大厂Java岗之"多线程与并发"面试题分享

创建事件调度线程安全信号量

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

JAVA线程池配置及使用注意事项

JAVA SE基础篇61.多线程相关1