首页 > 编程语言 >Java拾贝第八天——线程的状态和常用方法

Java拾贝第八天——线程的状态和常用方法

时间:2023-10-21 21:55:05浏览次数:28  
标签:Java 拾贝 Thread MyThread 线程 new main public

Java拾贝不建议作为0基础学习,都是本人想到什么写什么

任何线程一般具有5种状态。(非生命周期)

  1. 创建状态:新建了一个线程对象,但还处于不可运行状态。

  2. 就绪状态:新建线程后,调用该线程start()方法就可以启动线程。此时线程进入线程队列排队,并等待CPU分配资源。当线程启动时,进入该状态。

  3. 运行状态:获得CPU资源,线程进入运行状态。自动调用run()方法。

  4. 堵塞状态:一个正在执行的线程因为某种原因。让出CPU资源并暂时中止自己的执行,进入该状态。堵塞时,线程不能进入排队队列,只有堵塞原因消除,才可以转入就绪状态。

  5. 死亡状态:run()方法执行结束后,进入该状态。进入该状态的线程不再具有继续运行的能力。

获得线程名

public Thread(Runnable target, String name) {}//构造方法,String为线程名

Thread.currentThread().getName();//静态方法,currentThread()返回当前正在执行的线程
public class Test8 {
    public static void main(String[] args) {
        new Thread(new MyThread(),"自定线程A").start();
        new Thread(new MyThread(),"自定线程B").start();
		//打印main方法线程名
        System.out.println(Thread.currentThread().getName());
    }
}
class MyThread implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+" + hello");
    }
}

程序运行结果:

main
自定线程B + hello
自定线程A + hello

线程是否活动

Thread.isAlive();//普通方法 返回布尔值 T处于活动状态否则F
public class Test8 {
    public static void main(String[] args) {
        Thread a = new Thread(new MyThread(), "线程A");
        System.out.println("线程启动前"+a.isAlive());
        a.start();
        System.out.println("线程启动后"+a.isAlive());
        for (int i = 0; i <3 ; i++) {
            System.out.println(Thread.currentThread().getName()+" + "+i);
        }
        System.out.println("for循环之后"+a.isAlive());//这个不确定
    }
}
class MyThread implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+" + hello");
    }
}

程序运行结果:

线程启动前false
线程启动后true
main + 0
main + 1
main + 2
for循环之后true
线程A + hello

线程插队

Thread.join();//普通方法 强制让该线程运行。
public class Test8 {
    public static void main(String[] args) {
        Thread a = new Thread(new MyThread(), "线程A");
        a.start();
        for (int i = 0; i <20 ; i++) {
            System.out.println(Thread.currentThread().getName()+i);
            if (i==10){
                try {
                    a.join();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

        }

    }
}
class MyThread implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i <20 ; i++) {
            System.out.println(Thread.currentThread().getName()+" + hello"+i);
        }

    }
}

程序运行结果:

main0
线程A + hello0
main1
线程A + hello1
main2
线程A + hello2
main3
线程A + hello3
main4
线程A + hello4
main5
main6
线程A + hello5
线程A + hello6
线程A + hello7
main7
线程A + hello8
main8
main9
线程A + hello9
main10
i=10,此时线程A插队
线程A + hello10
线程A + hello11
线程A + hello12
线程A + hello13
线程A + hello14
线程A + hello15
线程A + hello16
线程A + hello17
线程A + hello18
线程A + hello19
main11
main12
main13
main14
main15
main16
main17
main18
main19

守护线程

Java程序入口就是由JVM启动main线程,main线程又可以启动其他线程。当所有线程都运行结束时,JVM退出,进程结束。JVM退出时,不必关心守护线程是否已结束。

如果某线程需要无限循环执行某定时任务可以将其设置为守护线程:

class MyThread implements Runnable{
    @Override
    public void run() {
       while (true){
           System.out.println(LocalTime.now());//获取当前时间  工具类
           try {
                Thread.sleep(60,000);//每1小时打印一次时间,1000=1秒
           }catch (Exception e){
               e.printStackTrace();
           }
       }

    }
}

礼让线程

Thread.yield() //普通方法 礼让线程
public class Test8 {
    public static void main(String[] args) {
        new Thread(new MyThread(), "线程A").start();
        for (int i = 0; i < 30; i++) {
            System.out.println(Thread.currentThread().getName()+i);
            if (i==20){
                Thread.yield();//主线程循环20,就礼让线程
            }
        }

    }
}
class MyThread implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i <20 ; i++) {
            System.out.println(Thread.currentThread().getName()+" + hello"+i);
        }

    }
}

程序运行结果:

main0
线程A + hello0
main1
main2
main3
线程A + hello1
main4
线程A + hello2
main5
线程A + hello3
main6
线程A + hello4
线程A + hello5
线程A + hello6
线程A + hello7
main7
线程A + hello8
main8
main9
main10
main11
线程A + hello9
main12
main13
main14
main15
main16
main17
线程A + hello10
main18
main19
main20
线程A + hello11
线程A + hello12
线程A + hello13
线程A + hello14
线程A + hello15
线程A + hello16
线程A + hello17
线程A + hello18
线程A + hello19
main21
main22
main23
main24
main25
main26
main27
main28
main29

标签:Java,拾贝,Thread,MyThread,线程,new,main,public
From: https://www.cnblogs.com/Ocraft/p/17779566.html

相关文章

  • 2023 Java面试题,看看你能答出来几道题目。
    下面是近一个月市面上收集的几道面试题(有传统企业,也有电商),答案会不定期更新在本篇文章中,你如有不同的见解,也可在评论区交流。1、jwt如何应用2、聊聊权限校验框架security,它由哪些部分组成3、业务设计:10min内超过30次登录限制登录。使用redis中zset实现,限流算法4、springboot......
  • Java基础的运算符和程序流程控制
    1.运算符计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。我们可以把运算符分成以下几组:算术运算符赋值运算符关系运算符逻辑运算符三目运算符位运算符1.1算术运算符算术运算符用在数学表达式中,它们的作用和在数......
  • 学习一年java思想总结
    如果你迷茫不妨看看我的思想总结java这门语言是一门非常厉害的,期初我是学python的越往后学,我就感觉不是特别喜欢。然后某天晚上我打开以前的java的一个简单项目。突然就喜欢上了,下定决心去学java。我先开始学的java基础。还是那就话java入门简单深入难,刚开始学基础语法......
  • Java基础 File 常见的成员方法(获取并遍历)—— listFiles ()
    public File[] listFiles()  →  获取当前该路径文件夹下所有内容,把所有的内容放到数组中返回Filef=newFile("E:\\Java基础资料");File[]files=f.listFiles();for(Filefile:files){//file依次表示Java基础资料文件夹里面的每一个文件或者文件夹Sys......
  • Java基础 File 常见的成员方法(创建、删除)
     createNewFile() 方法:细节一:如果当前路径表示的文件不存在,则创建成功,方法返回true;如果当前路径表示的文件已经存在,则创建失败,方法返回false细节二:如果父级路径是不存在的,那么方法会有IOException异常细节三:createNewFile() 方法创建的一定是文件。如果路径当中不......
  • Java拾贝第八天——多线程的创建
    Java拾贝不建议作为0基础学习,都是本人想到什么写什么进程与线程多线程是实现并发机制的一种有效手段,进程和线程一样都属于并发的一个单位。(线程比进程更小)。所谓多线程是指一个进程在执行过程中可以产生多个线程。这些线程可能同时存在、同时运行。一个进程可以包含一个或多......
  • Java基础 File 常见的成员方法(判断、获取)
     length()方法的细节:只能获取文件的大小,单位是字节。如果我们想要的单位是M,G等,可以不断地除以1024       len/1024:KB  len/1024/1024:MB  len/1024/1024/1024:G如果我们要获取一个文件夹的大小,需要把这个文件夹里面所有的文件大小都累加在......
  • java Intellij IDEA
    com/shop//││├─java.f97016ab│││└─.generated││├─sell.20409de3│││└─.generated││└─sell.f9743bdb││└─.generatedDOA层:定义实体.即有哪此字段及getter、setter等方法.数据库的curdcont......
  • Java基础 File
    File对象就表示一个路径,可以是文件的路径,也可以是文件夹的路径。甚至这个路径可以是存在的,也可以是不存在的 File类常见的构造方法有三个:public File(String pathname)  →  根据文件路径创建文件对象。把字符串表示的路径变成File对象public File(String......
  • Java基础 自定义异常
    自定义异常的意义:让控制台的报错信息更加见名知意 步骤:1.定义异常类,类名要见名知意2.写继承关系。如果定义的异常是运行时异常,要继承RuntimeException;如果是编译时异常,直接继承Exception3.写空参构造4.写带参构造......