当前位置: 代码迷 >> 综合 >> JAVA多线程(三)-常用控制线程的工具(join、sleep、yield)
  详细解决方案

JAVA多线程(三)-常用控制线程的工具(join、sleep、yield)

热度:89   发布时间:2023-12-16 04:17:31.0

join线程

join()方法:一个线程等待另一个线程完成,当某个程序执行流中调用其它线程的join()方法时,调用线程将被阻塞,直到join()方法加入的join线程执行完为止。

public class joinTest extends Thread{
    public joinTest(String name){
    super(name);}public void run(){
    for(int i=0;i<100;i++){
    System.out.println(getName()+" "+i);}}public static void main(String[] args)throws Exception {
    new joinTest("新线程").start();//启动“新线程”for(int i=0;i<100;i++){
    if(i==20){
    //Join线程会阻塞main线程,但和新线程并发执行joinTest jt=new joinTest("Join线程" );jt.start();jt.join();//“Join线程”调用join()方法,阻塞调用它的main线程}System.out.println(Thread.currentThread().getName()+" "+i);}}
}

结果分析:

//开始执行新线程
新线程 0
......
新线程 24
//开始执行main线程,main线程和新线程交替执行
main 0
...
main 11
新线程 25
main 12
......
新线程 34
//i=20,Join线程开始执行,main线程被阻塞,Join线程和新线程交替执行
Join线程 0
新线程 35
Join线程 1
新线程 36
......
Join线程 99
//join线程结束,main线程继续执行
main 20
......
main 99

join()方法另外两种重载方式:
在这里插入图片描述

后台线程

在这里插入图片描述

public class DaemonThread extends Thread{
    public void run(){
    for(int i=0;i<1000;i++)System.out.println(getName()+" "+i);}public static void main(String[] args) {
    DaemonThread t=new DaemonThread();System.out.println(t.isDaemon());//判断是否为后台线程:falset.setDaemon(true);//设置为后台线程,并且必须在start()前调用该方法System.out.println(t.isDaemon());//判断是否为后台线程:truet.start();for (int i=0;i<10;i++)System.out.println(Thread.currentThread().getName()+" "+i);//调用main线程//main线程执行结束,t也随之结束}

在这里插入图片描述

线程睡眠

在这里插入图片描述

线程让步

在这里插入图片描述

public class YieldTest extends Thread {
    public YieldTest(String name){
    super(name);}public void run(){
    for(int i=0;i<50;i++){
    System.out.println(getName()+" "+i);if(i==20)Thread.yield();}}public static void main(String[] args) {
    //启动两个线程YieldTest yieldTest1=new YieldTest("高级线程:");//yieldTest1.setPriority(Thread.MAX_PRIORITY);yieldTest1.start();YieldTest yieldTest2=new YieldTest("低级线程:");//yieldTest2.setPriority(Thread.MIN_PRIORITY);yieldTest2.start();}
}

调用yield()方法,线程的调用顺序和线程优先级有关。在多cpu并行环境下,yield()方法的功能并不明显。
sleep()和yield()的区别:
在这里插入图片描述

线程优先级

在这里插入图片描述
在这里插入图片描述

  相关解决方案