美文网首页并发编程
三、线程的挂起与唤醒

三、线程的挂起与唤醒

作者: liyc712 | 来源:发表于2020-08-31 09:26 被阅读0次

线程的挂起与唤醒

一、使用object

  • wait() 暂停执行、放弃已经获得的锁、进入等待状态
  • notify() 随机唤醒一个在等待锁的线程
  • notifyAll() 唤醒所有在等待锁的线程,自行抢占cpu资源
public class WaitDemo implements Runnable {

    private static Object waitObj = new Object();

    @Override
    public void run() {
        //持有资源
        synchronized (waitObj) {
            System.out.println(Thread.currentThread().getName()+"占用资源");
            try {
                waitObj.wait();// 调用wait会释放资源
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(Thread.currentThread().getName()+"释放资源");
    }

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new WaitDemo(),"对比线程");
        thread.start();

        Thread thread2 = new Thread(new WaitDemo(),"对比线程2");
        thread2.start();
        Thread.sleep(3000L);

        synchronized (waitObj) {
            waitObj.notify();
        }

    }
}

二、被废弃的方法

  • thread.suspend() 该方法不会释放线程所占用的资源。如果使用该方法将某个线程挂起,则可能会使其他等待资源的线程死锁
  • thread.resume() 方法本身并无问题,但是不能独立于suspend()方法存在
/**
 * 挂起操作的Demo
 */
public class SuspendDemo implements Runnable {

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"执行run方法,准备调用suspend方法");
        //挂起线程
        Thread.currentThread().suspend();// 挂起线程不会释放资源,容易死锁
        System.out.println(Thread.currentThread().getName()+"执行run方法,调用suspend方法结束");

    }

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new SuspendDemo());
        thread.start();
        Thread.sleep(3000L);
        //对线程进行唤醒操作
        thread.resume();
    }
}

相关文章

  • 三、线程的挂起与唤醒

    线程的挂起与唤醒 一、使用object wait() 暂停执行、放弃已经获得的锁、进入等待状态 notify() ...

  • LockSupport原理与线程挂起/唤醒

    本文一些理解和代码参考了看过的网上一些文章,感谢原作者们 之前在Java并发编程中的等待/通知范式 - 肥兔子爱豆...

  • wait() 和 notify()

    wait() : 线程挂起,等待被唤醒。notify() : 通知其他某一个线程从挂起态转换到就绪态 。这两个方法...

  • Java 并发“锁“的本质(一步步实现锁)

    前言 在上篇分析了CAS、线程挂起/唤醒相关知识后,常规的做法本篇就需要分析Synchronized与AQS的源码...

  • 线程基础

    线程创建的三种方法 ThreadRunnableFutureTask三种线程实现及对比 线程的等待与唤醒 wait...

  • 公平锁与非公平锁

    前提: 线程等待时会被挂起,轮到他时会被唤醒 公平锁: 新进程发出请求,如果此时一个线程正持有锁,或有其他线程正在...

  • LockSupport 介绍

    LockSupport 的功能 LockSupport 是JDK 中提供的一个工具类,用来挂起和唤醒线程,这个类是...

  • AbstractQueuedSynchronizer (AQS)

    双队列 在AQS中,存在两个队列 等待队列:用于挂起当前线程,等待某个条件满足后唤醒或是被中断。 同步队列:多线程...

  • LockSupport

    LockSupport简介 LockSupport用来实现线程的挂起和唤醒,它是Java6引入的一个工具类,它简单...

  • JVM对锁的优化

    自旋锁和自适应自旋锁 为何引入 互斥同步最大的性能消耗在于阻塞的实现。即线程的挂起和唤醒必须转入内核态中实现,线程...

网友评论

    本文标题:三、线程的挂起与唤醒

    本文链接:https://www.haomeiwen.com/subject/juxusktx.html