Java多线程07—线程的通信以及sleep()和wait()的比较

简介: Java多线程07—线程的通信以及sleep()和wait()的比较

线程的通信

@[toc]
涉及到的三个方法:

  • wait():一但执行此方法,当前线程就进入阻塞状态,并释放同步监视器
  • notify():一旦执行此方法,就会唤醒被wait的一个线程,如果有多个线程被wait,就唤醒优先级高的那个
  • notifyAll():一旦执行此方法,就会唤醒所有被wait的线程

说明

  1. wait()、notify()、notifyAll()三个方法必须使用在同步代码块或同步方法中
  2. wait()、notify()、notifyAll()三个方法的调用者必须是同步代码块或同步方法中的同步监视器,否则会出现java.lang.IllegalMonitorStateException异常
  3. wait()、notify()、notifyAll()这三个方法是定义在java.lang.Object类中
  • (解释):要求同步监视器去调用,但是同步监视器又规定的任何对象都可以,所以相当于这个方法要任何对象都可以调用,所以就放在了Object当中

先由一个练习题例子来引入

题目:使用两个线程打印 1-100。线程1, 线程2 交替打印

package com.jsm.Java4;


public class lxt {
    public static void main(String[] args) {
        Number num = new Number();
        Thread t1 = new Thread(num);
        Thread t2 = new Thread(num);
        t1.setName("线程1:");
        t2.setName("线程2:");
        t1.start();
        t2.start();

    }
}

class Number implements Runnable {
    private int number = 1;
    @Override
    public void run() {
        while (true) {
            synchronized (this) {
                notify();
                if (number <= 100) {
                    System.out.println(Thread.currentThread().getName() + "打印:" + number);
                    number++;
                    try {
                        wait();//使得调用如下wait()方法的线程进入阻塞状态
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    break;
                }
            }

        }
    }
}

sleep()和wait()的异同


  1. sleep()方法在Java多线程01—线程的初步理解和基于Thread类创建线程关于Thread类中的方法中有提到
  2. wait()方法在本文中提到

  • 相同点:一旦执行方法,都可以使得当前的线程进入阻塞状态
  • 不同点

    1. 声明的位置不同:Thread类中声明sleep(),Object类中声明wait()
    2. 调用的范围(要求)不同:sleep()可以在任何需要的场景下调用,wait()必须使用在同步代码块或者同步方法中调用
    3. 关于是否是否释放同步监视器的问题:如果两个方法都使用在同步代码块或者同步方法中,sleep()不会释放同步监视器,而wait会释放同步监视器
目录
相关文章
|
4天前
|
网络协议 算法 Java
【Java网络编程】网络编程概述、UDP通信(DatagramPacket 与 DatagramSocket)
【Java网络编程】网络编程概述、UDP通信(DatagramPacket 与 DatagramSocket)
16 3
|
5天前
|
Java 数据库
【Java多线程】对线程池的理解并模拟实现线程池
【Java多线程】对线程池的理解并模拟实现线程池
13 1
|
3天前
|
安全 Java
java-多线程学习记录
java-多线程学习记录
|
5天前
|
Java
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
15 0
|
5天前
|
设计模式 消息中间件 安全
【Java多线程】关于多线程的一些案例 —— 单例模式中的饿汉模式和懒汉模式以及阻塞队列
【Java多线程】关于多线程的一些案例 —— 单例模式中的饿汉模式和懒汉模式以及阻塞队列
10 0
|
5天前
|
安全 Java 程序员
【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)
【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)
8 0
|
2月前
|
安全 Java
深入理解Java并发编程:线程安全与性能优化
【2月更文挑战第22天】在Java并发编程中,线程安全和性能优化是两个重要的主题。本文将深入探讨这两个主题,包括线程安全的基本概念,如何实现线程安全,以及如何在保证线程安全的同时进行性能优化。
16 0
|
7天前
|
安全 Java
Java中的并发编程:理解并发性与线程安全
Java作为一种广泛应用的编程语言,在并发编程方面具有显著的优势和特点。本文将探讨Java中的并发编程概念,重点关注并发性与线程安全,并提供一些实用的技巧和建议,帮助开发人员更好地理解和应用Java中的并发机制。
|
15天前
|
缓存 安全 Java
Java并发编程中的线程安全问题及解决方法
在Java编程中,线程安全是一个至关重要的问题,特别是在并发编程中。本文将探讨Java并发编程中常见的线程安全问题,包括数据竞争、死锁和内存可见性,并介绍了相应的解决方法,如使用同步锁、并发容器和原子类等技术,以确保多线程环境下程序的正确性和性能。
9 2
|
1月前
|
安全 Java 容器
Java并发编程:实现高效、线程安全的多线程应用
综上所述,Java并发编程需要注意线程安全、可见性、性能等方面的问题。合理使用线程池、同步机制、并发容器等工具,可以实现高效且线程安全的多线程应用。
17 1