zoukankan      html  css  js  c++  java
  • 线程的状态和方法

    虚拟机中的线程状态有六种,定义在Thread.State():

    t1.getState():查看当前线程状态。

    1、新建状态NEW,比如"Thread t = new Thread()

    2、可运行状态RUNNABLE,调用start()方法

    3、阻塞BLOCKED,正在等待监视器锁,以便进入一个同步的块/方法,

    4、等待WAITING,Object的wait()方法、Thread的join()方法、LockSupport的park()方法

    5、超时等待TIMED_WAITING,调用带超时的wait(3000), join() , park() 方法

    6、终止状态TERMINATED,run()方法执行结束

    Thread中的实例方法:

    1、start(),

    2、run()、

    3、isAlive(),保证线程执行完成。

    1
    2
    Thread.sleep(100);//睡眠0.1s保证mt中的线程执行完。
    System.out.println("end == " + mt.isAlive());

    4、getId(),有一个long型的全局唯一的线程ID生成器threadSeqNumber

    5、getName(),默认以"Thread-threadInitNum"的方式来命名新生成的线程,setName

    6、getPriority(),默认setPriority(5)

    7、isDaeMon、setDaemon(boolean on),一种是用户线程,一种是守护线程

    1
    2
    3
    4
    5
    6
    7
    TestThread1 mt = new TestThread1();
    mt.setDaemon(true);//设置为守护线程,5s后必定结束。
    mt.start();
    Thread.sleep(5000);
    mt.join();//等待线程销毁时,再执行后面代码。main线程就会无限期阻塞直到mt的run()方法执行完毕,内部调用的是wait()方法。
    mt.interrupt();//未阻塞,不起作用。
    System.out.println("我离开thread对象再也不打印了,我停止了!");
    <wiz_tmp_tag class="wiz-block-scroll">
     

    8、interrupt(),阻塞时抛出一个中断信号,这样线程就退出阻塞状态,没有被阻塞的线程,调用interrupt()方法是不起作用的?

    9、isInterrupted(),测试线程是否已经中断,但不清除状态标识

    10、join(),是等待线程销毁。

           join(2000)表示调用join()方法所在的线程最多等待2000ms,执行过程中会释放锁;

     

    Thread中的静态方法:

    1、currentThread(),返回的是对当前正在执行线程对象的引用。

    2、sleep(long millis),在指定的毫秒内让当前"正在执行的线程"(Thread.currentThread())休眠(暂停执行)

    3、yield(),暂停当前执行的线程对象,并执行其他线程。这个暂停是会放弃CPU资源的,并且放弃CPU的时间不确定。run中执行yield(),退出时间不确定。

    4、interrupted(),测试当前线程是否已经中断,执行后具有将状态标识清除为false的功能。

    1、线程类的构造方法、静态块是被main线程调用的;

    2、而线程类的run()方法才是应用线程自己调用的

    1、this.XXX()

    这种调用方式表示的线程是线程实例本身,在main函数中为Thread_0 ;

    2、Thread.currentThread.XXX()或Thread.XXX()

    这种调用方式表示的线程是正在执行Thread.currentThread.XXX()所在代码块的线程 ;

    3、当前执行的Thread未必就是Thread本身 ;

    sleep(2000)不释放锁,join(2000)释放锁:

    1、join(2000)即最多等待2s,通过不断轮询,查看线程是否活动,销毁后理解释放锁;

    2、join()=join(0)是不断的询问线程的状态,直到线程销毁join()方法才会结束;

    3、sleep是native方法,等待时间结束后才释放锁,与线程状态无关。

    Thread类中run()和start():
    run()方法:在本线程内调用该Runnable对象的run()方法,可以重复多次调用,不是启动线程,只是普通调用方法,自动等待调用结束执行后面代码;
    start()方法:启动一个线程,调用该Runnable对象的run()方法,不能多次启动一个线程;

    两个线程调用状态:

    创建后,进入new状态;

    调用start方法后,进入runnable状态。

    wait()方法对应的线程调用Sleep方法,进入timed_waiting状态;

    wait()方法释放锁,进入waiting状态:

    notify()方法不释放锁,wait对应的线程进入blocked状态,等待notify对应的线程运行结束,wait对应的线程进入runnable状态;

    wait线程执行完毕,进入terminated状态。

    1、将通过毅力完成的事转化为习惯。
    2、清心寡欲、方能高枕无忧。
    3、纸上得来终觉浅,绝知此事要躬行。

    种一棵树最好的时间是 十年前。 其次是, 现在!

  • 相关阅读:
    Jmeter常用脚本开发之JDBC请求
    Jmeter常用脚本开发之Java请求
    Jmeter常用脚本开发之FTP请求
    Jmeter常用脚本开发之Debug Sampler
    Jmeter常用脚本开发之Beanshell Sampler
    Jenkins构建.net项目
    Charles基本使用
    [daily] emacs显示file name buffer的全路径
    [dev] 刷HHKP的一般流程及常见错误(多图慎点)
    [dev][go] 入门Golang都需要了解什么
  • 原文地址:https://www.cnblogs.com/shuchen007/p/9157517.html
Copyright © 2011-2022 走看看