zoukankan      html  css  js  c++  java
  • 多线程-线程间的通信

    线程间的通信

    线程通信就是线程与线程间进行信息的交换。

    这里可以举个例子,两个线程交替的打印0-9这10个数字。
    首先分析一下,比如线程一先开始打印,当它打印了数字0后,他应该等待线程二打印数字1,线程二打印了之后又要等待线程一打印数字2...
    那怎么样才能让线程一开始等待呢?这里可以使用Object类中的wait()方法。

    代码演示:

    public class ThreadTest5 {
    
        public static void main(String[] args) {
            Number number = new Number();
    
            Thread t1 = new Thread(number,"小明");
            Thread t2 = new Thread(number,"小红");
    
            t1.start();
            t2.start();
        }
    
    }
    class Number implements Runnable{
    
        private int num = 1;
    
        @Override
        public void run() {
            while (true){
                synchronized(this) {
                    //notify();//唤醒线程,让线程进入就绪状态等待CPU调度
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    if (num < 10) {
                        System.out.println(Thread.currentThread().getName() + num++);
                        try {
                            wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    } else {
                        break;
                    }
                }
            }
        }
    }
    
    

    如果只有wait()方法,那么两个线程都会进入阻塞状态。

    所以需要使用notify()或notifyAll()来唤醒线程,让他们进入就绪状态。
    如果有多个线程进行打印,那么需要使用notifyAll()方法。

    notif()方法会唤醒一个阻塞状态的线程,如果有多个线程是阻塞状态,会唤醒优先级高的线程。
    notifyAll()方法会将所有的阻塞状态的线程唤醒。
    wait()方法会让线程进入阻塞状态并释放当前的锁对象。

    注意:wait()、notify()和、notifyAll()方法必须在同步方法或者同步代码块中使用。

  • 相关阅读:
    .Net 4.0新特性之Dynamic 动态类型(转载)
    三种提高Google Analytics效率的方法(转载)
    PowerBuilder 12使.NET的应用开发更快捷
    .Net 之匿名类(AnonymousType)(转载)
    ASP.NET MVC学习笔记一(转载)
    js动态获取虚拟目录名称 相当于服务端ResolveUrl("")方法(转载)
    CSS 备忘(转载)
    ASP.NET4与VS2010开发Ajax Library特征(转载)
    POJ1988 Cube Stacking
    HDU3694 Fermat Point in Quadrangle
  • 原文地址:https://www.cnblogs.com/Z-Dey/p/12895992.html
Copyright © 2011-2022 走看看