Java 进阶(8) 线程常用方法

这篇具有很好参考价值的文章主要介绍了Java 进阶(8) 线程常用方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

常用方法

方法名

说明

public static void sleep(long millis)

当前线程主动休眠 millis 毫秒。

public static void yield()

当前线程主动放弃时间⽚,回到就绪状态,竞争下⼀次时间⽚。

public final void join()

允许其他线程加⼊到当前线程中。

public void setPriority(int)

线程优先级为1-10,默认为5,优先级越⾼,表示获取CPU机会越多。

public void setDaemon(boolean)

设置为守护线程线程有两类:⽤户线程(前台线程)、守护线程(后台线程)

线程的优先级

我们可以通过传递参数给线程的 setPriority() 来设置线程的优先级别

调整线程优先级:Java线程有优先级,优先级高的线程会获得较多的运⾏机会。优先级 : 只能反映线程的中或者是紧急程度 , 不能决定 是否⼀定先执行

Java线程的优先级⽤整数表示,取值范围是1~10,Thread类有以下三个静态常量:

static int MAX_PRIORITY
    线程可以具有的最⾼优先级,取值为10。
static int MIN_PRIORITY
    线程可以具有的最低优先级,取值为1。
static int NORM_PRIORITY
    分配给线程的默认优先级,取值为5。

示例:文章来源地址https://www.toymoban.com/news/detail-415724.html

class PriorityThread extends Thread{
    @Override
    public void run() {
        for(int i=0;i<50;i++) {
            System.out.println(Thread.currentThread().getName()+"============"+i);
        }
    }
}

public class TestPriority {
    public static void main(String[] args) {
        PriorityThread p1 = new PriorityThread();
        p1.setName("P1线程");

        PriorityThread p2 = new PriorityThread();
        p2.setName("P2线程");

        PriorityThread p3 = new PriorityThread();
        p3.setName("P3线程");
        
        p1.setPriority(Thread.MAX_PRIORITY);
        p3.setPriority(Thread.MIN_PRIORITY);

        p1.start();
        p2.start();
        p3.start();
    }
}

线程的休眠

使⽤线程的 sleep() 可以使线程休眠指定的毫秒数,在休眠结束的时候继续执⾏线程

示例:

class SleepThread extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("新开的线程:"+i);
        }
    }
}

public class TestSleep {
    public static void main(String[] args) {
        SleepThread sleepThread = new SleepThread();
        sleepThread.start();;
        System.out.println("---------------------");
        //让当前线程睡眠10秒
        try {
            Thread.sleep(1000*2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        for (int i = 0; i < 10; i++) {
            System.out.println("主线程:"+i);
        }

    }
}

线程的让步

Thread.yield() ⽅法作⽤是:暂停当前正在执⾏的线程对象(及放弃当前拥有的cup资源),并执⾏其他线程。

yield() 做的是让当前运⾏线程回到可运⾏状态,以允许具有相同优先级的其他线程获得运⾏机会。因此,使⽤ yield() 的⽬的是让相同优先级的线程之间能适当的轮转执⾏。但是,实际中⽆法保证 yield() 达到让步⽬的,因为让步的线程还有可能被线程调度程序再次选中。

class Task1 implements Runnable{

    @Override
    public void run() {
        for (int i = 0;i < 100;i++){
            System.out.println("A:"+i);
        }
    }
}

class Task2 implements Runnable{

    @Override
    public void run() {
        for (int i = 0;i < 10;i++){
            System.out.println("B:"+i);
            //让步
            Thread.yield();
        }
    }
}

public class TestYield {
    public static void main(String[] args) {
//        Task1 task1 = new Task1();
//        Thread thread = new Thread(task1);
//        thread.start();
        //匿名对象,这个方法只需要使用一次
        new Thread(new Task1()).start();
        new Thread(new Task2()).start();
    }
}

sleep()和yield()的区别

sleep()使当前线程进⼊停滞状态,所以执⾏sleep()的线程在指定的时间内肯定不会被执⾏;

yield()只是使当前线程重新回到可执⾏状态,所以执⾏yield()的线程有可能在进⼊到可执⾏状态后⻢上⼜被执⾏。

sleep ⽅法使当前运⾏中的线程睡眼⼀段时间,进⼊不可运⾏状态,这段时间的⻓短是由程序设定的,yield ⽅法使当前线程让出 CPU 占有权,但让出的时间是不可设定的。实际上,yield()⽅法对应了如下操作:先检测当前是否有相同优先级的线程处于同可运⾏状态,如有,则把 CPU的占有权交给此线程,否则,继续运⾏原来的线程。所以yield()⽅法称为“退让”,它把运⾏机会让给了同等优先级的其他线程另外,sleep ⽅法允许较低优先级的线程获得运⾏机会,但 yield() ⽅法执⾏时,当前线程仍处在可运⾏状态,所以,不可能让出较低优先级的线程些时获得 CPU 占有权。在⼀个运⾏系统中,如果较⾼优先级的线程没有调⽤ sleep ⽅法,⼜没有受到 I\O 阻塞,那么,较低优先级线程只能等待所有较⾼优先级的线程运⾏结束,才有机会运⾏。

 线程的合并

Thread 中, join() ⽅法的作⽤是调⽤线程等待该线程完成后,才能继续往下运⾏。

join是Thread类的⼀个⽅法,启动线程后直接调⽤,即join()的作⽤是:“等待该线程终⽌”,这⾥需要理解的就是该线程是指的主线程等待⼦线程的终⽌。也就是在⼦线程调⽤了join()⽅法后⾯的代码,只有等到⼦线程结束了才能执⾏。

Java 进阶(8) 线程常用方法

为什么要⽤join()方法

在很多情况下,主线程⽣成并起动了⼦线程,如果⼦线程⾥要进⾏⼤量的耗时的运算,主线程往往将于⼦线程之前结束,但是如果主线程处理完其他的事务后,需要⽤到⼦线程的处理结果,也就是主线程需要等待⼦线程执⾏完成之后再结束,这个时候就要⽤到 join() ⽅法了。

示例:

class JoinThread extends Thread{
    public JoinThread(String name){
        super(name);
    }
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+"打印---->"+i);
        }
    }
}

public class TestJoin {
    public static void main(String[] args) {
        System.out.println("主线程开始执行.....");

        JoinThread joinThread = new JoinThread("新加入的线程");
        joinThread.start();
        try {
            joinThread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("主线程结束执行.....");
    }
}

到了这里,关于Java 进阶(8) 线程常用方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java基础教程】(四十二)多线程篇 · 上:多进程与多线程、并发与并行的关系,多线程的实现方式、线程流转状态、常用操作方法解析~

    理解进程与线程的区别; 掌握Java 中多线程的两种实现方式及区别; 掌握线程的基本操作方法; 进程是程序的一次动态执行过程,它经历了从代码加载、执行到执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到最终消亡的过程 。多进程操作系统能同时运行多

    2024年02月16日
    浏览(34)
  • Java之多线程进阶

    目录 一.上节内容复习 1.线程池的实现 2.自定义一个线程池,构造方法的参数及含义 3.线程池的工作原理 4.拒绝策略 5.为什么不推荐系统提供的线程池 二.常见的锁策略 1.乐观锁和悲观锁 2.轻量级锁和重量级锁 3.读写锁和普通互斥锁 4.自旋锁和挂起等待锁 5.可重入锁和不可重入

    2024年02月05日
    浏览(34)
  • Java 进阶(12) 线程通信

    多个线程在处理同⼀个资源,但是处理的动作(线程的任务)却不相同。 为什么要处理线程间通信 多个线程并发执⾏时, 在默认情况下CPU是随机切换线程的,当我们需要多个线程来共同完成⼀件任务,并且我们希望他们有规律的执⾏, 那么多线程之间需要⼀些协调通信,以此

    2023年04月16日
    浏览(25)
  • 【Java】多线程(进阶)

    乐观锁 乐观锁的基本思想是假设在数据的读取和修改过程中不会有其他的线程对其进行修改, ,因此乐观锁不会立即对数据进行加锁,而是在更新数据时检查是否发生了冲突,如果发现冲突(即数据被其他线程修改),则会进行回滚操作,乐观锁通常使用版本号,时间戳等机制来实现 优

    2024年02月10日
    浏览(25)
  • Java 进阶(7) 创建线程

    1. 定义Thread类的⼦类,并重写该类的run()⽅法,该run()⽅法的⽅法体就代表了线程需要完成的任务,因此把run()⽅法称为线程执⾏体。 2. 创建Thread⼦类的实例,即创建了线程对象 3. 调⽤线程对象的start()⽅法来启动该线程 示例: 测试: 1. 定义Runnable接⼝的实现类,并重写该接⼝

    2023年04月16日
    浏览(29)
  • 【Java多线程进阶】CAS机制

    前言 CAS指的是Compare-And-Swap(比较与交换),它是一种多线程同步的技术,常用于实现无锁算法,从而提高多线程程序的性能和扩展性。本篇文章具体讲解如何使用 CAS 的机制以及 CAS 机制带来的问题。 目录 1. 什么是CAS? 2. CAS的应用 2.1 实现原子类 2.2 实现自旋锁 3. CAS的ABA问

    2024年02月10日
    浏览(28)
  • Java中的线程池技术进阶

    Java中的线程池技术是用于管理和复用线程的一种技术,它可以有效地提高应用程序的性能和响应速度。在Java中,线程池可以通过java.util.concurrent包中的ExecutorService接口和相关实现类来创建和使用。 以下是一些关于Java线程池技术的进阶知识: 线程池参数配置: corePoolSize:核

    2024年01月20日
    浏览(23)
  • 面试宝典进阶之Java线程面试题

    (1)线程是CPU调度的最小单位,进程是计算分配资源的最小单位。 (2)一个进程至少要有一个线程。 (3)进程之间的内存是隔离的,而同一个进程中的线程之间是共享内存的。 T2、【初级】线程的创建有哪几种方式? (1)继承Thread类,重写run方法。 (2)实现Runnable接口

    2024年02月02日
    浏览(32)
  • java筑基--基础不牢,地动山摇,线程基础入门到进阶

    1.1 线程相关概念 1.1.1 程序(program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码. 1.1.2 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存空间。当我们使用迅雷,又启动了一个进程,操作系

    2024年02月16日
    浏览(26)
  • 【多线程】认识Thread类及其常用方法

    📄 前言 : 本文是对以往多线程学习中 Thread类 的介绍,以及对其中的部分细节问题进行总结。 之前的文章介绍过线程的引入能够更好地处理程序的并发执行问题。在Java中,线程的创建方式之一是通过 Thead类 (Thead封装了操作系统提供的API,使我们创建的线程能够系统的调

    2024年01月18日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包