3、Thread API的简单介绍

1、sleep方法

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

sleep方法的作用是让当前线程暂停执行指定时间,给执行机会留给其他线程,但是调用sleep不会释放对象锁

1.1、用TimeUnit代替Thread.sleep

  可以使用TimeUnit类代替Thread.sleep,TimeUnit是jdk1.5以后增加的一个枚举类,对sleep方法提供了很好的封装,可以省去时间单位的换算。

思考1:sleep(n)和sleep(0)有什么不同
  线程有Runnable和Waiting两种状态,Runnable状态又包含就绪状态和运行状态,当调用sleep(n)时,当前线程从运行状态转为等待状态,线程被放入等待队列,等待定时器n秒后的中断事件,当到达n秒计时时,线程从等待队列进入到就绪队列。需要注意的是等待队列里的线程是不参与CPU竞争的,而就绪队列里的线程才会参与CPU竞争;
  当调用sleep(0)时,当前线程是直接从运行状态转为就绪状态的,即线程直接进入到了就绪队列,就会参与CPU竞争。当然调用sleep(0)的目的并非真正的让线程挂起0毫秒,而是在于让当前线程暂时放弃CPU,给执行机会留给其它线程,相当于一个让位动作。

思考2:如何唤醒正在睡眠的线程(sleeping)
  调用Sleep(n)会使得当前线程暂停执行指定时间,线程进入等待队列,并且不会释放对象锁,这时线程状态就变为阻塞状态,如果另外一个线程调用被阻塞线程的interrupt方法,那么就可以打断这种阻塞,并且会抛出InterruptedException,但是如果线程已经是死亡的状态了,那么尝试对其interrupt就会被忽略。
类似Object的wait、Thread的sleep、Thread的join等方法都会使得线程进入阻塞状态,调用Thread的interrupt都会打断这种阻塞。

2、currentThread方法

  currentThread方法返回的是一个线程实例,这个实例就是指当前代码正在被哪个线程调用的线程实例,可以通过这个方法来获取线程的相关的一些信息,比如线程ID,线程名称等。

public static native Thread currentThread();

3、getId方法

  getId方法返回的是线程的ID,这个线程ID是在线程初始化时生成的一个唯一长整型数值

public long getId()

  在创建线程的初始化方法里设置线程ID,生成线程ID的方法是一个静态同步方法,保证了生成ID的唯一性

private void init(...){
    ...省略...
    // 设置线程ID
    tid = nextThreadID();
}    
// 生成线程ID
private static synchronized long nextThreadID() {
    return ++threadSeqNumber;
}

4、getName方法

  getName方法返回的是线程名称,在创建线程初始化的时候生成

public final String getName()

public Thread(Runnable target) {
    init(null, target, "Thread-" + nextThreadNum(), 0);
}

private static synchronized int nextThreadNum() {
    return threadInitNumber++;
}

5、isAlive方法

  isAlive是用来判断一个线程是否存活,而判断一个线程是否存活在于线程已经启动但是还没有死亡(也就是线程执行完毕)

public final native boolean isAlive();

6、interrupt方法

  interrupt方法用来中断线程可以中断Object#wait、Thread#join、Thread#sleep等各自的一系列方法,并且会抛出一个InterruptedException异常
当调用上述方法时,会使得线程进入一个阻塞的状态,在另一个线程里调用某线程的interrupt方法就可以打断某个线程的阻塞状态。但是打断并是意味着线程的生命周期已经结束,仅仅是打断了了这种阻塞的状态。被中断的线程会抛出InterruptedException异常,这个异常相当于是一个信号一样,通知当前线程被打断了。

7、interrupted方法与isInterrupted方法

  interrupted():用来判断当前线程是否已经中断,执行后具有将状态标志置为false的功能

public static boolean interrupted() {
    return currentThread().isInterrupted(true);
}

  isInterrupted():用来判断某个线程是否已经中断,不具有清除状态标志的功能

public boolean isInterrupted() {
    return isInterrupted(false);
}

private native boolean isInterrupted(boolean ClearInterrupted);

8、join方法

  join方法就是主线程中调用子线程的join方法,主线程会等待子线程执行完毕后,才会继续执行。
  join方法底层是调用Object类的wait方法,因此也必须加对象锁

public final synchronized void join(long millis) throws InterruptedException
public final synchronized void join(long millis, int nanos) throws InterruptedException
public final void join() throws InterruptedException {
    join(0);
}

9、yield方法

  调用yield方法就是暗示线程调度执行器,当前线程愿意让出当前处理器的使用,给执行机会留给其他线程,但是线程调度执行器也可以忽略这个暗示,说白了就是这个让出了处理器的线程,可以再次被线程调度执行器选中占有处理器从而继续执行。

public static native void yield();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值