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);
}