java线程的常用方法和属性介绍

start()

  start方法是Thread 类的方法,在这个方法中会调用native方法(start0())来启动线程,为该线程分配资源。

sleep()

  sleep方法有2个方法。

 public static native void sleep(long millis) 


throws InterruptedException;
public static void sleep(long millis, int nanos)
throws InterruptedException {
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}

    if (nanos < 0 || nanos > 999999) {
        throw new IllegalArgumentException(
                            "nanosecond timeout value out of range");
    }

    if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
        millis++;
    }

    sleep(millis);
}

  看了源码,发现第二个纳秒级别的没什么用,实际上还是毫秒级别。
  sleep方法在进入阻塞队列时不会释放当前线程所持有的锁。

yield()

  该方法会让当前线程交出cpu权限,但是不能确定具体时间,和sleep方法一样不会释放当前线程所持有的锁,该方法会让线程直接进入就绪状态,很好理解。目的是为了让同等优先级的线程获得cpu执行的机会。

join()

  该方法是让当前线程阻塞,直到调用该方法的线程执行完毕。源码分析

 public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;

    if (millis < 0) {
        throw new IllegalArgumentException("timeout value is negative");
    }

    if (millis == 0) {
        while (isAlive()) {
            wait(0);
        }
    } else {
        while (isAlive()) {
            long delay = millis - now;
            if (delay <= 0) {
                break;
            }
            wait(delay);
            now = System.currentTimeMillis() - base;
        }
    }
} 


  这个是join的源码,代码很清晰,如果调用该方法的对象线程已启动,那么当前线程释放该对象锁,并进入条件等待队列里面,等待改线程执行完(线程如果在同步代码块中结束会自动调用notifyAll()方法来唤醒等待队列里面的线程)

wait() ,notifyAll(),notify()

  这3个方法一般一同出现。且都是Object类的方法,用来辅助操作线程类。
  这3个方法都必须在同步代码块中,不然就会报错。
  wait()方法会让当前线程释放锁,并进入到条件等待队列。
  notify()方法会随机唤醒条件等待队列的任意一个线程,并将其放到锁池里面。
  notifyAll()方法则是唤醒条件等待队列的所有线程,并将其都放到锁池里面。
  而锁池里面的线程来竞争所需要的对象锁,成功获取到锁的线程将加入到就绪队列里面。

interrupt(),isInterrupted(),interrupted()

  这3个方法表示线程的中断,这个很有意思,分多钟情况讨论。(在java中,中断不是强制停止改线程,而是给线程一个信号,让其自行处理何时退出)
  isInterrupted:就是返回对应线程的中断标志位是否为true。
  interrupted:返回当前线程的中断标志位是否为true,但它还有一个重要的副作用,就是清空中断标志位,也就是说,连续两次调用
  interrupted(),第一次返回的结果为true,第二次一般就是false 。
  interrupt:表示中断对应的线程。

  中断线程分情况讨论:
  1.还没start,或者已经结束,无效果
  2.运行中,中断无效,直到只能设置个中断位,直到线程走完或者进入阻塞。
  3.锁池,中断无效。
  4.阻塞,等待,会抛出异常,可以中断。
  ps(io等待大多都是可以中断的,但是inputStream的read不会相应中断。)
  中断不好使,因此最好自己在线程类里面提供关闭方法。比如

 class MyThread extends Thread{
private volatile boolean isStop = false;
@Override
public void run() {
int i = 0;
while(!isStop){
i++;
}
}

    public void setStop(boolean stop){
        this.isStop = stop;
    }
}

总结

  在这里我没有写具体的例子,因为例子大家可以自己写测试下,太占篇幅了,这里只举出一些源码。

猜你喜欢

转载自www.cnblogs.com/donghang/p/9233825.html