27
2020
07

JAVA线程的几种常用方法

线程启动函数

//Thread.java

//调用start启动线程,进入Runnable状态,等待系统调度执行

public synchronized void start(){//synchronized同步执行

    if (threadStatus != 0) //0 代表new状态,非0则抛出错误

            throw new IllegalThreadStateException();

    ...

    start0(); //本地方法方法 private native void start0()

    ...

}

//Running状态,新线程执行的代码方法,可被子类重写

public void run() {

    if (target != null) {

        //target是Runnable,new Thread(Runnable)时传入

        target.run(); 

    }

}


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

线程终止函数

//Thread.java

@Deprecated public final void stop();

//中断线程

public void interrupt()

//判断的是当前线程是否处于中断状态

public static boolean interrupted()

1

2

3

4

5

6

用stop会强行终止线程,导致线程所持有的全部锁突然释放(不可控制),而被锁突同步的逻辑遭到破坏。不建议使用

interrupt函数中断线程,但它不一定会让线程退出的。它比stop函数优雅,可控制

当线程处于调用sleep、wait的阻塞状态时,会抛出InterruptedException,代码内部捕获,然后结束线程

线程处于非阻塞状态,则需要程序自己调用interrupted()判断,再决定是否退出

其他常用方法

//Thread.java

//阻塞等待其他线程

public final synchronized void join(final long millis)

//暂时让出CPU执行

public static native void yield();

//休眠一段时间

public static native void sleep(long millis) throws InterruptedException;

1

2

3

4

5

6

7

start与run方法的区别

start是Thread类的方法,从线程的生命周期来看,start的执行并不意味着新线程的执行,而是让JVM分配虚拟机栈,进入Runnable状态,start的执行还是在旧线程上

run则是新线程被系统调度,获取CPU时执行的方法,函数run则是继承Thread重写的run或者实现接口Runnable的run

Thread.sleep与Object.wait区别

Thread.sleep需要指定休眠时间,时间一到可继续运行;和锁机制无关,没有加锁也不用释放锁

Object.wait需要在synchronized中调用,否则报IllegalMonitorStateException错误。wait方法会释放锁,需要调用相同锁对象Object.notify来唤醒线程

« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。