Java 创建两个线程模拟对话并交替输出实现解析

需求说明

实现方式

嗯 这个可以视作一个经典的消费者和生产者的问题,详细见代码注释

代码内容

消费者,负责取走生产者产生的信息

/**
 * @auther::9527
 * @Description: 消费者
 * @program: 多线程
 * @create: 2019-08-10 10:45
 */
public class Consumer extends Thread{
  private MiddleMan mid = null;

  public Consumer() {
  }

  public Consumer(MiddleMan movie) {
    this.mid = movie;
  }

  @Override
  public void run() {
    //循环显示50次电影信息
    for (int i = 0; i <1000 ; i++) {
      try {
        Thread.sleep(100);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      this.mid.get();
    }
  }
}

生产者,负责生产信息

/**
 * @auther::9527
 * @Description:
 * @program: 多线程
 * @create: 2019-08-10 10:39
 */
public class Producer implements Runnable{
  //生产数据
  private MiddleMan mid = null;
  private boolean flag = false;

  public Producer(MiddleMan movie) {
    this.mid = movie;
  }

  public Producer() {
  }

  @Override
  public void run() {
    //循环录入,两部电影交替录人
    for (int i = 0; i <1000; i++) {
      if (flag){
        this.mid.set("jack说:","我是查水表");
        flag = false;
      } else {
        this.mid.set("rose说:","你是谁啊?");
        flag = true;
      }
    }
  }
}

信息中转场地 负责控制生产和消费的节奏

package com.duo;

/**
 * @auther::9527
 * @Description: 生产者和消费者
 * @program: 多线程
 * @create: 2019-08-10 10:36
 */
public class MiddleMan {
  private String name;
  private String info;
  private boolean flag = true; //设置标志位,控制生产者生产,消费者消费

  public String getName() {
    return name;
  }

  public String getInfo() {
    return info;
  }

  public MiddleMan(String name, String info) {
    this.name = name;
    this.info = info;
  }

  public MiddleMan() {
  }

  public synchronized void set(String name,String info){
    if (!flag){
      try {
        super.wait();  //当前线程等待
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
      this.name = name;
    try {
      Thread.sleep(100);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
      this.info = info;
    flag = false;  //重置标志位,让消费者消费
    super.notify(); //使用Object的notify方法,让消费者线程被唤醒
  }
  public synchronized void get(){
    if (flag){
      try {
        super.wait();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
    System.out.println(this.getName()+"-"+this.getInfo());
    flag = true;
    super.notify(); //唤醒线程
  }
}

程序入口

/**
 * @auther::9527
 * @Description: 测试类
 * @program: 多线程
 * @create: 2019-08-10 11:47
 */
public class Test {
  public static void main(String[] args) {
    //生产===>>拿走  生产出来就被拿走
    MiddleMan mid = new MiddleMan();
    Thread producer = new Thread(new Producer(mid));
    Thread consumer = new Thread(new Consumer(mid));
    producer.start();
    consumer.start();
  }
}

运行结果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java并发编程示例(一):线程的创建和执行

    开门见山 在IT圈里,每当我们谈论并发时,必定会说起在一台计算机上同时运行的一系列线程.如果这台电脑上有多个处理器或者是一个多核处理器,那么这时是实实在在的"同时运行":但是,如果计算机只有一个单核处理器,那么这时的"同时运行"只是表象而已. 所有的现代操作系统全部支持任务的并发执行.你可以边听音乐,边上网看新闻,还不耽误首发电子邮件.我们可以说,这种并发是 进程级并发 .在进程内部,我也可以看到有许许多多的并发任务.我们把运行在一个进程里面的并发任务称 线程. 和

  • Java 线程池详解及创建简单实例

    Java 线程池 最近在改进项目的并发功能,但开发起来磕磕碰碰的.看了好多资料,总算加深了认识.于是打算配合查看源代码,总结并发编程的原理. 准备从用得最多的线程池开始,围绕创建.执行.关闭认识线程池整个生命周期的实现原理.后续再研究原子变量.并发容器.阻塞队列.同步工具.锁等等主题.java.util.concurrent里的并发工具用起来不难,但不能仅仅会用,我们要read the fucking source code,哈哈.顺便说声,我用的JDK是1.8. Executor框架 Exec

  • java线程之使用Runnable接口创建线程的方法

    实现Runnable接口的类必须使用Thread类的实例才能创建线程.通过Runnable接口创建线程分为两步: 1. 将实现Runnable接口的类实例化. 2. 建立一个Thread对象,并将第一步实例化后的对象作为参数传入Thread类的构造方法. 最后通过Thread类的start方法建立线程. 下面的代码演示了如何使用Runnable接口来创建线程: 复制代码 代码如下: package mythread; public class MyRunnable implements Runn

  • Java并发编程示例(七):守护线程的创建和运行

    Java有一种特殊线程,守护线程,这种线程优先级特别低,只有在同一程序中的其他线程不执行时才会执行. 由于守护线程拥有这些特性,所以,一般用为为程序中的普通线程(也称为用户线程)提供服务.它们一般会有一个无限循环,或用于等待请求服务,或用于执行任务等.它们不可以做任何重要的工作,因为我们不确定他们什么时才能分配到CPU运行时间,而且当没有其他线程执行时,它们就会自动终止.这类线程的一个典型应用就是Java的垃圾回收. 在本节示例中,我们将创建两个线程,一个是普通线程,向队列中写入事件:另外一个是

  • Java创建多线程的两种方式对比

    采用继承Thead类实现多线程: 优势:编写简单,如果需要访问当前线程,只需使用this即可,无需使用Thead.currentThread()方法. 劣势:因为这种线程类已经继承了Thead类,所以不能再继承其它类. 示例代码: 复制代码 代码如下: package org.frzh.thread;    public class FirstThread extends Thread{      private int i;           //重写run方法,run方法的方法体就是线程执

  • 创建并运行一个java线程方法介绍

    要解释线程,就必须明白什么是进程. 什么是进程呢? 进程是指运行中的应用程序,每个进程都有自己独立的地址空间(内存空间),比如用户点击桌面的IE浏览器,就启动了一个进程,操作系统就会为该进程分配独立的地址空间.当用户再次点击左面的IE浏览器,又启动了一个进程,操作系统将为新的进程分配新的独立的地址空间.目前操作系统都支持多进程. 要点:用户每启动一个进程,操作系统就会为该进程分配一个独立的内存空间. 线程--概念 在明白进程后,就比较容易理解线程的概念. 什么是线程呢? 是进程中的一个实体,是被

  • java 创建线程的几种方式

    说道线程,肯定会想到使用 java.lang.Thread.java这个类 那么创建线程也主要有2种方式 第一种方式: public class MyThread extends Thread { public void run() { System.out.println("这是MyThread线程"); } } 然后在调用处,执行start方法即可: MyThread myThread = new MyThread(); myThread.start(); 第二种方式实现Runna

  • Java多线程中线程的两种创建方式及比较代码示例

    1.线程的概念:线程(thread)是指一个任务从头至尾的执行流,线程提供一个运行任务的机制,对于java而言,一个程序中可以并发的执行多个线程,这些线程可以在多处理器系统上同时运行.当程序作为一个应用程序运行时,java解释器为main()方法启动一个线程. 2.并行与并发: (1)并发:在单处理器系统中,多个线程共享CPU时间,而操作系统负责调度及分配资源给它们. (2)并行:在多处理器系统中,多个处理器可以同时运行多个线程,这些线程在同一时间可以同时运行,而不同于并发,只能多个线程共享CP

  • Java 创建两个线程模拟对话并交替输出实现解析

    需求说明 实现方式 嗯 这个可以视作一个经典的消费者和生产者的问题,详细见代码注释 代码内容 消费者,负责取走生产者产生的信息 /** * @auther::9527 * @Description: 消费者 * @program: 多线程 * @create: 2019-08-10 10:45 */ public class Consumer extends Thread{ private MiddleMan mid = null; public Consumer() { } public Co

  • Java创建和启动线程的两种方式实例分析

    本文实例讲述了Java创建和启动线程的两种方式.分享给大家供大家参考,具体如下: 方式1:继承Thread类 步骤: 1):定义一个类A继承于java.lang.Thread类. 2):在A类中覆盖Thread类中的run方法. 3):我们在run方法中编写需要执行的操作:run方法里的代码,线程执行体. 4):在main方法(线程)中,创建线程对象,并启动线程. (1)创建线程类对象: A类 a = new A类(); (2)调用线程对象的start方法: a.start();//启动一个线程

  • Java创建与结束线程代码示例

    本文讲述了在Java中如何创建和结束线程的最基本方法,只针对于Java初学者.一些高级知识如线程同步.调度.线程池等内容将会在后续章节中逐步深入. 创建线程 创建普通线程有两种方式,继承Thread类或实现Runnable接口.示例如下. 方法1:继承Thread类 创建方法示例: public class MyThread1 extends Thread { @Override public void run() { //TODO Auto-generated method stub supe

  • Java创建并运行线程的方法

    Java线程类也是一个object类,它的实例都继承自java.lang.Thread或其子类. 可以用如下方式用java中创建一个线程: Tread thread = new Thread(); 执行该线程可以调用该线程的start()方法: thread.start(); 在上面的例子中,我们并没有为线程编写运行代码,因此调用该方法后线程就终止了. 编写线程运行时执行的代码有两种方式:一种是创建Thread子类的一个实例并重写run方法,第二种是创建类的时候实现Runnable接口.接下来我

  • java实现两个线程交替打印的实例代码

    使用ReentrantLock实现两个线程交替打印 实现字母在前数字在后 package com.study.pattern; import java.util.concurrent.CountDownLatch; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public c

  • Java 用两个线程交替打印数字和字母

    前一段时间听马士兵老师讲课,讲到某公司的一个面试,两个线程,其中一个线程输出ABC,另一个线程输出123,如何控制两个线程交叉输出1A2B3C,由于本人多线程掌握的一直不是很好,所以听完这道题,个人感觉收获良多,这是一个学习笔记.这道题有多种解法,不过有些属于纯炫技,所以只记录常见的三种解法.首先看第一种 1. park 和 unpark package cn.bridgeli.demo;   import com.google.common.collect.Lists;   import ja

  • 【java 多线程】守护线程与非守护线程的详解

    Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) 用户线程即运行在前台的线程,而守护线程是运行在后台的线程. 守护线程作用是为其他前台线程的运行提供便利服务,而且仅在普通.非守护线程仍然运行时才需要,比如垃圾回收线程就是一个守护线程.当VM检测仅剩一个守护线程,而用户线程都已经退出运行时,VM就会退出,因为没有如果没有了被守护这,也就没有继续运行程序的必要了.如果有非守护线程仍然存活,VM就不会退出. 守护线程并非只有虚拟机内部提供,用户在编写程序

  • C++详解如何实现两个线程交替打印

    C++线程库,点击此处查看文档 首先简单搭一个框架,让两个线程先尝试实现交替打印. //实现两个线程交替打印 #include <iostream> #include <thread> using namespace std; int main(void) { int n = 100; int i = 0; //创建两个线程 thread t1([&n, &i](){ while (i < n) { cout << i << "

  • Java中的守护线程问题

    目录 守护线程 在Java中有两类线程 守护线程与用户线程的区别 1 定义和概述 2 使用守护线程 3 测试案例 4 注意事项 守护线程 在Java中有两类线程 User Thread(用户线程) Daemon Thread(守护线程) 守护线程的功能非常简单,在其本身是一个线程的同时,主要是为了给其他的线程提供服务,比如说计时器,清空高速缓存等等操作,守护线程具有和被守护线程一样的生命周期(这里并不是说守护线程和被守护线程常常是1-1的关系),当被守护线程死亡,守护线程往往也会死亡,当虚拟机中

  • Java 创建线程的两个方法详解及实例

    Java 创建线程的两个方法 Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法: ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法. 为什么Java要提供两种方法来创建线程呢?它们都有哪些区别?相比而言,哪一种方法更好呢?

随机推荐