一、sleep() 与 wait()

两者都会让当前线程进入等待状态。唤醒后都需要等待 CPU 资源,不一定会立即执行。若在等待期间被调用此线程的的 interrupt() 方法,将会产生 InterruptedException 异常。

wait() 是 Object 类的方法,会释放对象锁,并让出 CPU 资源。只能在 synchronized 下使用,使用 notify() 或 notiftAll() 唤醒。

Java-线程等待、唤醒与中断
// 线程工厂,这里主要用来设置线程名字
ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("demo-pool-%d").build();
// 创建线程池
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(6, 6, 0L,
        TimeUnit.MILLISECONDS,
        new LinkedBlockingQueue<Runnable>(1024),
        namedThreadFactory,
        new ThreadPoolExecutor.AbortPolicy());

Object object = new Object();
threadPool.execute(() -> {
    try {
        synchronized (object) {
            object.wait();
            System.out.println("AAAAAAAAAAAAAAAAAAAAAAAAAAA");
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
});

threadPool.execute(() -> {
    synchronized (object) {
        System.out.println("BBBBBBBBBBBBBBBBBBBBBBBBBBB");
        object.notify();
    }
});
View Code

相关文章: