首页 > 编程语言 >Java之thread常用成员

Java之thread常用成员

时间:2023-06-28 09:04:52浏览次数:39  
标签:常用 Java thread Thread t2 t1 start 线程 new

setName用于自定义线程的名字,方便我们调试定为问题;

    @Test
    public void setNameTest(){
        Runnable run = ()->{
            System.out.println(Thread.currentThread().getName());
        };
        var t1 = new Thread(run);

        t1.start();

        var t2 = new Thread(run);
        t2.setName("t2");
        t2.start();
//        Thread-0
//        t2
    }

sleep是静态方法会暂停当前线程的执行

    @Test
    public void sleepTest() throws InterruptedException {
        var t1 = new Thread(()->{
            for (int i = 0; i < 10; i++) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }
        });
        t1.setName("t1");
        t1.start();

        var t2 = new Thread(()->{
            for (int i = 0; i < 10; i++) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        t2.setName("t2");
        t2.start();

        t1.join();
        t2.join();
//        t1:0
//        t1:1
//        t1:2
//        t2:0
//        t1:3
//        t1:4
//        t1:5
//        t1:6
//        t1:7
//        t1:8
//        t1:9
//        t2:1
//        t2:2
//        t2:3
//        t2:4
//        t2:5
//        t2:6
//        t2:7
//        t2:8
//        t2:9
    }

线程的yield(让步)操作的作用是让目前正在执行的线程放弃当前的执行,让出CPU的执行权限,使得CPU去执行其他的线程。处于让步状态的JVM层面的线程状态仍然是RUNNABLE状态,但是该线程所对应的操作系统层面的线程从状态上来说会从执行状态变成就绪状态。线程在yield时,线程放弃和重占CPU的时间是不确定的,可能是刚刚放弃CPU,马上又获得CPU执行权限,重新开始执行。

 @Test
    public void yieldTest() throws InterruptedException {
        var t1 = new Thread(()->{
            for (int i = 0; i < 10; i++) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }
        });
        t1.setName("t1");
        t1.setPriority(Thread.MIN_PRIORITY);


        var t2 = new Thread(()->{
            for (int i = 0; i < 10; i++) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
                if(i % 3 == 0){
                    Thread.yield();
                }
            }
        });
        t2.setName("t2");
        t2.setPriority(Thread.MAX_PRIORITY);

        t1.start();
        t2.start();

        t1.join();
        t2.join();
//        t2:0
//        t2:1
//        t2:2
//        t2:3
//        t1:0
//        t2:4
//        t1:1
//        t2:5
//        t2:6
//        t1:2
//        t2:7
//        t1:3
//        t2:8
//        t1:4
//        t2:9
//        t1:5
//        t1:6
//        t1:7
//        t1:8
//        t1:9

    }

调用join()方法的语句可以理解为合并点,合并的本质是:线程A需要在合并点等待,一直等到线程B执行完成,或者等待超时。

@Test
    public void joinTest() throws InterruptedException {
        var t1 = new Thread(()->{
            for (int i = 0; i < 10; i++) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }
        });
        t1.setName("t1");

        var t2 = new Thread(()-> {
            for (int i = 0; i < 10; i++) {
                if(i == 3){
                    try {
                        t1.join();
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }
        });
        t2.setName("t2");

        t1.start();
        t2.start();
        t2.join();
//        t2:0
//        t2:1
//        t2:2
//        t1:0
//        t1:1
//        t1:2
//        t1:3
//        t1:4
//        t1:5
//        t1:6
//        t1:7
//        t1:8
//        t1:9
//        t2:3
//        t2:4
//        t2:5
//        t2:6
//        t2:7
//        t2:8
//        t2:9
    }

Java线程的最大优先级值为10,最小值为1,默认值为5,优先级只是一个相对值,并不是高优先级的必然先执行完;

@Test
    public void priorityTest() throws InterruptedException {
        var t1 = new Thread(()->{
            for (int i = 0; i < 10; i++) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }

        });
        t1.setPriority(Thread.MAX_PRIORITY);

        var t2 = new Thread(()->{
            for (int i = 0; i < 10; i++) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }

        });
        t2.setPriority(Thread.MIN_PRIORITY);

        t1.start();
        t2.start();
        t1.join();
        t2.join();
//        Thread-0:0
//        Thread-0:1
//        Thread-1:0
//        Thread-0:2
//        Thread-1:1
//        Thread-1:2
//        Thread-1:3
//        Thread-1:4
//        Thread-1:5
//        Thread-1:6
//        Thread-1:7
//        Thread-0:3
//        Thread-1:8
//        Thread-0:4
//        Thread-1:9
//        Thread-0:5
//        Thread-0:6
//        Thread-0:7
//        Thread-0:8
//        Thread-0:9
    }

标签:常用,Java,thread,Thread,t2,t1,start,线程,new
From: https://www.cnblogs.com/wufengtinghai/p/17510417.html

相关文章

  • 【后端面经-Java】Synchronize和ReentrantLock区别
    目录1.概念介绍1.1线程安全锁1.2公平锁1.3响应中断/等待可中断2.区别2.1底层实现2.2锁的用法2.3锁的特点2.4性能比较2.5适用场景3.总结比较参考文献1.概念介绍1.1线程安全锁Synchronize(同步锁)和ReentrantLock(可重入锁)都是Java中的常用锁,都是用来保证线程安全的。......
  • mysql常用命令
    连接到MySQL服务器:mysql-uusername-p显示数据库列表:SHOWDATABASES;创建数据库:CREATEDATABASEdatabase_name;删除数据库 USEdatabase_name;DROPDATABASEdatabase_name;  切换到指定数据库:USEdatabase_n......
  • java反序列化与反序列化
    java反序列化漏洞JAVA反序列化漏洞是由于开发者重写了readObject方法,该readObject方法方法调用了别的方法,最终执行到了例如Transfrom方法的危险方法java序列化过程:调用一个函数进行序列化,存放到一个文件内,再将文件反序列化回来,涉及到文件的读写序列化与反序列化序列化:Objec......
  • 【Java】讲讲StreamAPI
     预设场景:从Mybatis调用Mapper得到的用户集合List<UserDTO>userList=newArrayList<>(); 常用的几种API用法示例:Map方法,转换为某一个字段的集合:List<Integer>userIdList=userList.stream()/*map转换成某个类型来处理,比如这个场景是为了快速......
  • Linux(Ubuntu) 常用命令的总结
    Linux(Ubuntu)常用命令的总结总结工作中用到的ubuntu命令,和添加一些常见的Linux的命令;1.文件操作&常见命令操作前置补充:Linux终端提示符&&命令语法Centos[root@oldboy_python~]##[用户名@主机机器名路径]提示符#用户名root#主机名oldboy_python#......
  • JavaBlog-3
    前言第三次也是最后博客文章主要是关于java课程第三阶段关于PTA题目集、超星作业以及在实验平台上布置的一些题型。相较于第一、二阶段的作业总结而言此次作业更加针对于总结在面向对象过程中的三大技术特性,即封装性、继承性和多态性,类图的设计更加普遍。在不断深入学习Java......
  • JavaScript 中模块的导入和导出
    模块简介html文档一般在标签中引入外部js文件<script>标签引入的脚本中创建的变量,都会被注册为window对象下全局变量,这样做会污染全局命名空间这就衍生除了模块化的解决方案,比如CommonJS等,但是这些解决方案都不是JavaScript原生的,直到ES6支持JavaScript模块的使用。......
  • Java学习——IDEA编辑器 导出项目对应Java Doc文件
    IDEA生成JavaDoc帮助文档方法一:使用命令行生成1.选中项目右键showinExplor。。2.选中地址栏cmd3.输入命令javadoc-encodingUTF-8-charsetUTF-8Doc.java4.在项目地址中查看生成html等文件方法二:使用idea生成1.(选中要生成文档的类)找到工具栏tools-->......
  • Java学习3——第七至十 一次题目集以及第三阶段学习的分析与总结
    一.前言   本次Blog是对java学习中第三阶段的一个总结,作为刚学习JAVA不久的小白,以下依旧只是本人作为普通学生,以当前能力和状态所做出的总结和分析,不足之处也欢迎各位大佬的指正! 第七至第十一次题目集,总体题量都比较少,其中较多的也就5道题,其它的就1道。总体难度较第四-六......
  • Java ssh 访问windows/Linux
    工作中遇到的问题:Javacode运行在一台机器上,需要远程到linux的机器同时执行多种命令。原来采用的方法是直接调用ssh命令或者调用plink的命令。google下java的其他ssh方法,发现有个包。具体介绍如下:GanymedSSH2forJavaisalibrarywhichimplementstheSSH-2protocolinpure......