线程状态
这里通过一个例子来看下不同锁的线程状态是什么样的?
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
ReentrantLock lock = new ReentrantLock();
executorService.submit(new ThreadLockState(lock));
executorService.submit(new ThreadLockState(lock));
executorService.submit(new ThreadSynchronizedState());
executorService.submit(new ThreadSynchronizedState());
executorService.shutdown();
}
static class ThreadLockState implements Runnable {
private ReentrantLock lock;
public ThreadLockState(ReentrantLock lock) {
this.lock = lock;
}
@Override
public void run() {
lock.lock();
System.out.println("Lock抢到锁。。。。");
try {
while (true) {
int a = 1;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
static class ThreadSynchronizedState implements Runnable {
@Override
public void run() {
synchronized (TestThreadState.class) {
System.out.println("Synchronized抢到锁。。。。");
try {
while (true) {
int a = 1;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
}
}
打印栈信息可以看到
通过Synchronized关键字锁住的线程的状态是BLOCKED
通过Lock锁住的线程的状态是WAITING
通过Sleep挂起的线程的状态是TIMED_WAITING
等待网络IO的线程的状态是RUNNABLE
网上说分析线程栈,一般盯着 WAIT、Block、TIMEOUT_WAIT 等状态,其实不然,处于 RUNNABLE 状态的线程也不能忽略,因为 MySQL 的读写、HTTP 请求等网络读写,即在等待对端网络的返回数据时线程的状态是 RUNNABLE,并不是所谓的 BLOCK 状态。