龙空技术网

java线程类Thread的常用方法

大龄java爱好者 19

前言:

当前小伙伴们对“属于thread类的方法”大致比较注重,朋友们都想要学习一些“属于thread类的方法”的相关资讯。那么小编在网络上网罗了一些关于“属于thread类的方法””的相关内容,希望姐妹们能喜欢,你们一起来学习一下吧!

类的定义:

public  class Thread implements Runnable {}
构造方法1、无参构造方法
public Thread() {     init(null, null, "Thread-" + nextThreadNum(), 0);}  private static synchronized int nextThreadNum() {    return threadInitNumber++;} private static int threadInitNumber;private static synchronized int nextThreadNum() {     return threadInitNumber++;}

此无参构造方法会创一个默认线程名为“Thread-编号”的线程,编号是static静态常量,默认0,然后每次创建都会增加1

2、有参构造

//构建带有线程名称的线程public Thread(String name) {       init(null, null, name, 0);}//构建Runnable实例的线程,线程名默认//注意Thread类也为Runnable实例,因此,可以将一个线程设置为另一个线程的子线程public Thread(Runnable target) {         init(null, target, "Thread-" + nextThreadNum(), 0);}//构建Runnable实例和线程名称的线程public Thread(Runnable target, String name) {       init(null, target, name, 0);}
3、常用方法

sleep方法(本地方法),接受传入毫秒数,此方法抛出中断异常,中断异常不属于RuntimeException异常,所以需要在调用方法中去处理异常。阻塞方法,其到时间后会自动恢复就绪状态,如果线程中断就会抛出InterruptedException异常

public static native void sleep(long millis) throws InterruptedException;
yield方法(本地方法),线程礼让,但是并不代表一定会让给其他线程,仅仅是给线程调度器的一个暗示,调度器是否执行就看调度器的心情了。
public static native void yield();
start方法(启动线程)
public synchronized void start() {                //线程状态,不为0代表已经启动了,会执出非法异常         if (threadStatus != 0)                       throw new IllegalThreadStateException();        //将线程加入线程调         group.add(this);        //启动前启动标志false        boolean started = false;         try {                 //关键方法              start0();                //启动标志true          started = true;      } finally {          try {                   if (!started) {                 group.threadStartFailed(this);                }            } catch (Throwable ignore) {          }        }  } //本地方法,由当前操作系统实现private native void start0();
run方法,start启动后实际执行的主体方法,如果线程构造传入Runnable实例,则执行的是Runnable实例中的run方法,否则是需要由其子类实现此方法。
public void run() {       if (target != null) {       target.run();     } }
interrupt中断方法,中断线程,将其置就绪状态,置中标标识符为true,等待调度器的分配 ,中断可以中断正在运行的线程,也可以中断阻塞状态,中断阻塞状态时会产生InterruptedException中断异常。
public void interrupt() 
interrupted和isInterrupted方法,两个主要区别在于是否会重置中断状态
//静态方法,调用的当前线程的isInterrupted(),并且会重置当前线程的中断状态//重置后再次调用会返回false//if线程中断,第一次a.interrupted(),返回true,并且重置中断状态//所以第二次a.interrupted()会返回falsepublic static boolean interrupted() {       return currentThread().isInterrupted(true);} //普通方法,线程是否中断,不会重置线程的中断状态public boolean isInterrupted() {      return isInterrupted(false);} //本地方法private native boolean isInterrupted(boolean ClearInterrupted);

有个很有特点的程序,子线程启动后,将主线程休眠1秒,然后子线程中断,两次判断子线程的中断标识。

首先呢,子线程和主线程都已经启动了,然后主线程休眠1秒,1s太长了,所以子线程差不多已经执行完了,执行完了也就没有中断了,如果中主线程休眠的时间减小到1毫秒,多次测试结果可能会出现一个true,其实子线程和主线程的休眠无关的,如果在休眠期子线程执行完了,也就无所谓中断了,如果没有运行完,就会继续和主结程抢占时间段。

t1.start();try {      Thread.currentThread().sleep(1000);} catch (InterruptedException e) {    e.printStackTrace();}t1.interrupt();System.out.println(t1.isInterrupted());System.out.println(t1.isInterrupted());
join方法,强制线程,调用join方法的线程会一直执行到终止(die):Waits for this thread to die.当前线程会一直等待强制线程执行完毕,或者当前线程等待被打断,产生InterruptedException异常
public final void join() throws InterruptedException {      join(0);  }
wait():等待,强制阻塞,不能自动唤醒,需要相关的唤醒方法

此方法位于Object类之中

//本地方法,参数为最大等待时间public final native void wait(long timeout) throws InterruptedException;
notify()和notifyAll():唤醒休眠的线程,等待和唤醒需要成对使用

此方法位于Object类之中

public final native void notify();public final native void notifyAll();
优先级的操作方法:setPriority和getPriority
public final void setPriority(int newPriority){         ThreadGroup g;         checkAccess();          //默认优先级范围在1---10之间        if (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY) {               throw new IllegalArgumentException();        }        if((g = getThreadGroup()) != null) {          //设置的优先级不能超过线程组的优先级        if (newPriority > g.getMaxPriority()) {                 newPriority = g.getMaxPriority();              }               setPriority0(priority = newPriority);      }}

其中newPriority Thread类默认定义了三种参数:

MIN_PRIORITY = 1;NORM_PRIORITY = 5;MAX_PRIORITY = 10

通过源代码可知,优先级是在[1---10]之间

优先级高并不代表一定会先运行,只是说优先级高的先执行的概率要比优先级低的高

标签: #属于thread类的方法