线程状态流转

Scroll Down

线程状态

image-1690336188679

这里通过一个例子来看下不同锁的线程状态是什么样的?

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 {

                }
            }
        }
    }

打印栈信息可以看到
ThreadState

通过Synchronized关键字锁住的线程的状态是BLOCKED
通过Lock锁住的线程的状态是WAITING
通过Sleep挂起的线程的状态是TIMED_WAITING
ThreadStateSleep

等待网络IO的线程的状态是RUNNABLE

网上说分析线程栈,一般盯着 WAIT、Block、TIMEOUT_WAIT 等状态,其实不然,处于 RUNNABLE 状态的线程也不能忽略,因为 MySQL 的读写、HTTP 请求等网络读写,即在等待对端网络的返回数据时线程的状态是 RUNNABLE,并不是所谓的 BLOCK 状态。