java并发编程(三):线程的状态,threadlocal

1. 线程的状态:

    new:初始状态;线程开始创建, 但是还没开始调用start(),(设置线程所属线程组,优先级,是否是daemon线程);

    RUNNING:运行状态:调用start(),等待cpu时间片来轮训执行(线程创建就绪,调用start(),表示:当前线程同步告知虚拟机,只要线程规划器空闲,应立即启动调用start()线程的方法);

    Blocked:阻塞状态,和其他线程存在竞争的时候线程阻塞与锁;

    waiting;该线程进入等待状态,当前线程需要等待其他的线程做一些特定的操作(通知或者是中断)

    time_waiting:等待,在特定时间内返回;

    terminated:终止状态;表示当前线程已经执行完毕;

2.daemon;

daemon线程是一种支持性线程,守护线程,被用作程序中的后台调度以及支持性工作,当java虚拟机中不存在daemon线程的时候,虚拟机将会退出;

在线程执行start()  之前设置Thread.setDaemon(true);

需要注意:java虚拟机退出时,所有daemon线程都将会终止,线程中finally 可能不会执行;

3,wait(),sleep(long time)

wait()属于object 的方法,当线程 调用wait() 等待的时候,线程会主动释放对象锁,只有针对对象的notify()的时候,线程才会放进对象锁定池进行等待;

sleep(long time) 属于线程Thread的方法,sleep(time)会导致线程暂停运行多少时间,时间到了之后会继续运行,期间不会是释放掉对象锁;

4,notify(),notifyAll()

两个都是Object 上面的方法;都用于通知处于等待状态下的线程;

notify()通知在这个对象下wait()的线程退出wait()状态,使他获取到对象上的锁,这个notify  并不会影响其他的线程,即使当前对象空闲,只有重新一个notify()或者是notifyAll();

notifyAll();就是属于全部退出wait() 状态,如果该对象上的锁解除,被notify() 的线程就是开始进入竞争状态,成功的线程获取锁,其他线程继续回到wait() 状态;

5,Thread.join();

如果一个线程执行了thread.join(),表示当前线程等待thread 线程终止之后才开始执行thread.join()之后的语句

6,ThreadLocal

线程的本地变量,用于存储当前线程的变量副本,Thread 中包含有threadlocals(map),用于保存Threadlocal,其他线程访问不到这个threadlocal 的值;可以运用在数据连接源,不同的线程调用不同的数据源

   public static ThreadLocal<String>  threadlocals  = new  ThreaLocal<String>();

    public T get() {
// 当前线程
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;
            }
//如果不存在就将 value  设置为空
        return setInitialValue();
    }
  private T setInitialValue() {
        T value = initialValue();
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
        return value;
    }
   void createMap(Thread t, T firstValue) {
        t.threadLocals = new ThreadLocalMap(this, firstValue);
    }

猜你喜欢

转载自blog.csdn.net/waterflying2015/article/details/80890912