java线程中常用函数

1)线程睡眠

     sleep(long millis): 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)。使线程转到阻塞状态。millis参数设定睡眠的时间,以毫秒为单位。当睡眠结束后,就转为就绪(Runnable)状态。

2)线程加入

     t.join():指等待t线程终止。
     join是Thread类的一个方法,启动线程后直接调用,即join()的作用是:“等待该线程终止”,这里需要理解的就是该线程是指的主线程等待子线程的终止。也就是在子线程调用了join()方法后面的代码,只有等到子线程结束了才能执行。
     在很多情况下,主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他的事务后,需要用到子线程的处理结果,也就是主线程需要等待子线程执行完成之后再结束,这个时候就要用到join()方法了。

     示例代码:

/**
 * 文件名:Test
 * 创建者:xiebaoming
 * 创建时间:2021/12/8  22:54
 * 描述:主函数
 */
public class Test {

    public static void main(String[] args) {
        System.out.println("mainThread开始运行");
        MyThread myThread = new MyThread();
        myThread.start();
        try {
            myThread.join();   //主线程等待myThread线程执行完毕
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("mainThread执行完毕");

    }
}



/**
 * 文件名:MyThread
 * 创建者:xiebaoming
 * 创建时间:2021/12/8  22:54
 * 描述:子线程类
 */
public class MyThread extends Thread{
    @Override
    public void run() {
        super.run();
        for(int i = 1;i <=5; i++)   //子线程需要执行5次输出
            System.out.println("MyThread第"+i+"次运行");
    }
}

运行结果:(主进程等待子进程5次输出后结束)

3)线程让步

     yield():暂停当前正在执行的线程对象,并执行其他线程或者当前进程。
     yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。

     但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。

示例代码:

import static java.lang.Thread.sleep;

/**
 * 文件名:Test
 * 创建者:xiebaoming
 * 创建时间:2021/12/8  22:54
 * 描述:TODO
 */
public class Test {

    public static void main(String[] args) {

        MyThread myThread1 = new MyThread("进程1");
        MyThread myThread2 = new MyThread("进程2");

        myThread1.start();
        myThread2.start();

    }
}


/**
 * 文件名:MyThread
 * 创建者:xiebaoming
 * 创建时间:2021/12/8  22:54
 * 描述:TODO
 */
public class MyThread extends Thread{

    private String name;

    MyThread(String name){
        this.name=name;
    }

    @Override
    public void run() {
        super.run();
        for(int i = 1;i <=5; i++){
            System.out.println(name+"第"+i+"次运行");
            if(i==3){
                this.yield();    //变为可运行状态,重新与主线程竞争
            }
        }
    }
}

 运行结果:线程运行到第三次输出时会从运行状态变为可运行状态,重新进行竞争

4)设置线程优先级

      setPriority(): 更改线程的优先级。Java线程的优先级用整数表示,取值范围是1~10,Thread类有以下三个静态常量:
              static int MAX_PRIORITY
                     // 线程可以具有的最高优先级,取值为10。
              static int MIN_PRIORITY
                    //线程可以具有的最低优先级,取值为1。
              static int NORM_PRIORITY
                   //分配给线程的默认优先级,取值为5。

代码如下:

import static java.lang.Thread.*;

/**
 * 文件名:Test
 * 创建者:xiebaoming
 * 创建时间:2021/12/8  22:54
 * 描述:TODO
 */
public class Test {

    public static void main(String[] args) {

        MyThread myThread1 = new MyThread("进程1");
        MyThread myThread2 = new MyThread("进程2");

        //设置优先级
        myThread1.setPriority(MAX_PRIORITY);
        myThread2.setPriority(MIN_PRIORITY);

        myThread1.start();
        myThread2.start();

    }
}


/**
 * 文件名:MyThread
 * 创建者:xiebaoming
 * 创建时间:2021/12/8  22:54
 * 描述:TODO
 */
public class MyThread extends Thread{

    private String name;

    MyThread(String name){
        this.name=name;
    }

    @Override
    public void run() {
        super.run();
        for(int i = 1;i <=5; i++){
            System.out.println(name+"第"+i+"次运行");
            if(i==3){
                this.yield();    //变为可运行状态,重新与主线程竞争
            }
        }
    }
}

运行结果:(进程1最先运行)

 
 5)线程等待

      Object类中的wait()方法,导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 唤醒方法。这个两个唤醒方法也是Object类中的方法,行为等价于调用 wait(0) 一样。

【面试题】wait()和sleep()的区别:

  • sleep是线程中的方法,但是wait是Object中的方法。
  • sleep方法不会释放lock,但是wait会释放,而且会加入等待队列中
  • sleep方法不依赖于同步器synchronized,但是wait需要依赖synchronized关键字
  • sleep不需要被唤醒(休眠之后自动退出阻塞状态),但是wait需要(需要被别人中断)
  • 具体解答参考如下链接:

java多线程中sleep和wait的4个区别,你知道几个?_OceanStar的博客-CSDN博客_多线程中sleep和wait的区别sleep与wait的区别是面试中一个非常常见的问题,因为从表象来看,好像sleep和wait都能够使得线程处于阻塞状态,但是却有着本质上的区别。这篇文章就来好好分析一下整体的区别是四个sleep是线程中的方法,但是wait是Object中的方法。sleep方法不会释放lock,但是wait会释放,而且会加入等待队列中sleep方法不依赖于同步器synchronized,但是wait需要依赖synchronized关键字sleep不需要被唤醒(休眠之后自动退出阻塞状态),但是wait需要(需要被https://blog.csdn.net/zhizhengguan/article/details/107334377

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值