美文网首页
Java线程通信

Java线程通信

作者: 奔跑小电驴 | 来源:发表于2020-02-19 00:33 被阅读0次

Java线程通信

例子:连个线程交替打印1~100
终端输出
t1:1
t2:2
t1:3
t2:4
t1:5
...

其实这就是两个线程之间互相通信才能产生的结果,否则是不会如此规律的实现上述需求,只有线程t1打印完"1",通知线程t2,t2打印"2",再通知t1,如此往复才能实现,这个【通知】,即为线程通信

代码实现:

class Number implements Runnable{

    private int number = 1;

    @Override
    public void run() {
        while (true){
            synchronized (this) {
                //notify唤醒被wait的线程,如有多个wait的线程,则唤醒优先级高的
                //notifyAll唤醒所有wait的线程
                notify();
                if (number < 100) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(
                                Thread.currentThread().getName() + ":" + number);
                    number++;
                    try {
                        //使得调用wait方法的线程进入阻塞,wait会释放锁
                        wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    break;
                }
            }
        }
    }
}
public class Communicate {
    public static void main(String[] args) {
        Number number = new Number();
        Thread t1 = new Thread(number);
        Thread t2 = new Thread(number);
        t1.setName("T1");
        t2.setName("T2");
        t1.start();
        t2.start();

    }
}

代码中的注释已经简单的写下了通信的原理

1.wait()方法将当前线程所占用的锁释放,同时进入阻塞状态
2.notify()方法唤醒被wait()的线程
3.notifyAll()唤醒所有wait()的线程

这样,上述的例子就是t1打印完1,进入wait()阻塞状态同时释放锁,然后t2拿到锁,唤醒t1,这时候虽然t1被唤醒,但是由于唯一的锁正在被t2持有,所以还是要等到t2执行完,进入wait(),t1才能拿到锁,才能继续执行,如此往复,实现需求

相关文章

  • 2 Java内存模型

    java中线程通信用的是共享内存模型,java线程之间的通信总是隐式进行,整个通信过程对程序员完全透明。 Java...

  • Java线程模型

    Java线程模型 本文将从线程类型、线程通信、线程调度三个方面分析Java中的线程模型。 什么是线程? 线程就是进...

  • Java多线程的使用通信和控制

    Java多线程的使用通信和控制 1. Java多线程的使用和通信 实现多线程有两种方式 1. 继承Thread父类...

  • 线程间通信剖析——Java进阶

    Java线程间通信剖析 本文将介绍常用的线程间通信工具CountDownLatch、CyclicBarrier和P...

  • Java多线程(2)

    Java多线程(2) 线程间的通信 线程间的通信又称为进程内通信,多个线程实现互斥访问共享资源时会互相发送信号或等...

  • java内存模型

    java内存模型基础 并发编程,两个关键问题:线程通信和线程同步通信机制:共享内存和消息传递 java并发采用共享...

  • Java 线程通信之 wait/notify 机制

    前言 Java 线程通信是将多个独立的线程个体进行关联处理,使得线程与线程之间能进行相互通信。比如线程 A 修改了...

  • 第二节、Handler消息机制

    一、为什么要设计handler Java 多线程通信 Java 中有很多种方法实现线程之间相互通信访问数据,大概先...

  • Java socket

    Java Socket实现基于TCP和UDP多线程通信Java Socket编程

  • Java线程简介

    本文将介绍Java线程的状态、线程的中断、线程间通信和线程的实现。 线程的状态 Java语言定义了6种不同的线程状...

网友评论

      本文标题:Java线程通信

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