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线程调度及相关函数的主要内容,如果未能解决你的问题,请参考以下文章