首页 > 其他分享 >线程常用方法

线程常用方法

时间:2022-12-17 18:01:14浏览次数:52  
标签:常用 Thread start 线程 打断 debug sleep 方法

线程常用方法介绍

1、方法概述

方法说明 static 功能说明 注意
start() 启动一个新线程,
在新的线程运行
run方法中的代码
start方法只是让线程进入就绪,里面代码不一定立刻运行
(CPU的时间片还没分给它)。每个线程对象的start方法只
能调用一次,如果调用了多次会出现
IllegalThreadStateException
run() 新线程启动后会调
用的方法
如果在构造Thread对象时传递了Runnable参数,则线程启
动后会调用Runnable中的run方法,否则默认不执行任何操
作。但可以创建Thread的子类对象,来覆盖默认行为
join() 等待线程运行结束
join(long n) 等待线程运行结束,
最多等待n毫秒
getId() 获取线程id id唯一
getName() 获取线程名
setName(String) 修改线程名
getPriority() 获取线程优先级
setPriority(int) 修改线程优先 java中规定线程优先级是1~10的整数,默认是5,较大的优先级
能提高该线程被CPU调度的机率
getState() 获取线程状态 Java中线程状态是用6个enum表示,分别为:NEW
RUNNABLE、BLOCKED、WAITING、TIMED_WAITING.
TERMINATED
isInterrupted() 判断是否被打断, 不会清除打断标记
isAlive() 线程是否存活
(还 没有运行完毕)
interrupt() 打断线程 如果被打断线程正在sleep,wait,join会导致被打断的线程
抛出InterruptedException,并清除打断标记;如果打断的正
在运行的线程,则会设置打断标记;park的线程被打断,也
会设置打断标记
interrupted() static 判断当前线程是否
被打断
会清除打断标记
currentThread() static 获取当前正在执行
的线程
sleep(long n) static 让当前执行的线程
休眠n毫秒,休眠时
让出cpu的时间片
给其它线程
yield() static 提示线程调度器让
出当前线程对CPU
的使用
主要是为了测试调试

2、start() vc run()

start方法会启动一个线程,并执行实现的run方法,多次执行会抛异常:IllegalThreadStateException

单独调用run方法,会当作main线程中的一个普通线程

    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            log.debug("hello world");
        }, "t");

        t.run();
        t.start();
        t.start();//start()方法多次启动会抛异常IllegalThreadStateException
    }

3、sleep vs yield

1、sleep

1.调用sleep会让当前线程从Runnable进入Timed_Waiting状态

2.其它线程可以使用interrupt方法打断正在睡眠的线程,这时sleep方法会抛出InterruptedException

3.睡眠结束后的线程未必会立刻得到快行

4.建议用TimeUnit的sleep代替Thread的sleep来获得更好的可读性

2、yield

1.调用yield会上当前线程从Running进入Runnable状态,然后调度执行其它同优先级的线程。如果这时没
有同优先级的线程,那么不能保证让当前线程暂停的效果
2.具体的实现依赖于操作系统的任务调度器

3、线程优先级

  • 线程优先级会提示(hit)调度器优先调度该线程,但它仅仅是一个提示,调度器可以忽略它

  • 如果CPU比较忙,那么优先级高的线程会获得更多的时间片,但CPU闲时,优先级几乎没作用

  • 优先级1-10,默认为5

4、示例

打断正在sleep、wait、join的线程,清楚打断标记,并抛出异常

    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            try {
                log.debug("run...");
                TimeUnit.SECONDS.sleep(1);//还是使用了Thread.sleep(),线程执行1秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "t");
        t.start();

        log.debug("state1:{}", t.getState());
        try {
            Thread.sleep(500);//线程执行0.5秒,不停顿,容易导致t线程还没开始执行执行下面的语句:t.getState()等等,结果会不准确
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.debug("state2:{}", t.getState());

        //打断正在sleep、wait、join的线程,清楚打断标记
        log.debug("interrupt...");
        t.interrupt();
        log.debug("打断标记:{}", t.isInterrupted());
    }

yield会让出CPU,测试优先级和yield

    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            int count = 0;
            while (true) {
                Thread.yield();
                System.out.println("t1 ---->" + count++);
            }
        });

        Thread t2 = new Thread(() -> {
            int count = 0;
            while (true) {
                System.out.println("        t2 ---->" + count++);
            }
        });

//        t1.setPriority(Thread.MIN_PRIORITY);//优先级1
//        t2.setPriority(Thread.MAX_PRIORITY);//优先级10
        t1.start();
        t2.start();
    }

使用yield

使用优先级(注释 Thread.yield()

标签:常用,Thread,start,线程,打断,debug,sleep,方法
From: https://www.cnblogs.com/WangJiQing/p/16989271.html

相关文章

  • redis常用命令之string&list
    redis常用操做stringkey操作string<key:value>setnamejohngetnamelistsetnx<keyvalue>setnxgendermale(分布式锁)getgendersetnxgoods_1111delgoods_1ge......
  • webstorm常用快捷键分享
    下面是我整理的Webstorm的一些常用快捷键,都很实用,现在分享给大家:1.ctrl+shift+n:打开工程中的文件,目的是打开当前工程下任意目录的文件。2.ctrl+j:输出模板3.c......
  • Python之threading: 带你了解多线程的强大威力!
    前言什么是多线程多线程是指在一个程序中同时创建和使用多个执行流(thread)来执行不同的任务。这样多个任务就可以同时进行,从而提高程序的执行效率。在python使用多线......
  • Java 中匿名内部类的构造方法
    因为匿名内部类没有名字这个特殊性质,所以我们无从给它指定构造方法,构造方法必须和类名同名,类名都没有,构造方法就无从谈起了。但是匿名内部类可以通过直接调用父类的构造方......
  • 计算机毕设——中文分词方法研究与实现
    1.课题意义及目标中文分词技术不断发展,各种中文分词系统层出不穷。中文分词技术应用也原来越广泛。如搜索引擎的应用、语音识别系统、机器翻译、自动分类校对等。学生应通过......
  • 前端知识案例75-javascript基础语法-成员方法
    ......
  • 创建线程的4种方法
    线程创建方法1、继承Thread,重写run方法 privatestaticvoidone(){classTextendsThread{@Overridepublicvo......
  • python多线程修改共享全局变量不安全
    当需要对全局变量进行更改时,则会出现不安全的情况 #-*-coding:utf-8-*-"""================================================================================......
  • 第十四章《多线程》第8节:线程池
    系统启动一个线程的成本是比较高的,因为启动线程的操作要与操作系统交互。如果程序中需要创建大量生存期较短的线程,那么使用线程池将会大幅度提高程序的运行效率。线程池中保......
  • 第十四章《多线程》第9节:ThreadLocal类
    如果多个线程共用一个对象,那么这个对象的属性值对于这些线程都是相同的。例如有一个a对象,它有一个x属性,如果x属性的值是1,那么对于任何一个线程而言,a对象的x属性都是1。但有......