Java 测试:创建两个线程,模拟对话,交替输出

|--需求说明

|--实现方式

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

|--代码内容

 1 /**
 2  * @auther::9527
 3  * @Description: 消费者
 4  * @program: 多线程
 5  * @create: 2019-08-10 10:45
 6  */
 7 public class Consumer extends Thread{
 8     private MiddleMan mid = null;
 9
10
11     public Consumer() {
12     }
13
14     public Consumer(MiddleMan movie) {
15         this.mid = movie;
16     }
17
18     @Override
19     public void run() {
20         //循环显示50次电影信息
21         for (int i = 0; i <1000 ; i++) {
22             try {
23                 Thread.sleep(100);
24             } catch (InterruptedException e) {
25                 e.printStackTrace();
26             }
27             this.mid.get();
28         }
29     }
30 }

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

 1 /**
 2  * @auther::9527
 3  * @Description:
 4  * @program: 多线程
 5  * @create: 2019-08-10 10:39
 6  */
 7 public class Producer implements  Runnable{
 8     //生产数据
 9     private MiddleMan mid = null;
10     private boolean flag = false;
11
12     public Producer(MiddleMan movie) {
13         this.mid = movie;
14     }
15
16     public Producer() {
17     }
18
19     @Override
20     public void run() {
21         //循环录入,两部电影交替录人
22         for (int i = 0; i <1000; i++) {
23             if (flag){
24                 this.mid.set("jack说:","我是查水表");
25                 flag = false;
26             } else {
27                 this.mid.set("rose说:","你是谁啊?");
28                 flag = true;
29             }
30         }
31     }
32 }

生产者,负责生产信息

 1 package com.duo;
 2
 3 /**
 4  * @auther::9527
 5  * @Description: 生产者和消费者
 6  * @program: 多线程
 7  * @create: 2019-08-10 10:36
 8  */
 9 public class MiddleMan {
10     private String name;
11     private String info;
12     private boolean flag = true; //设置标志位,控制生产者生产,消费者消费
13
14     public String getName() {
15         return name;
16     }
17
18     public String getInfo() {
19         return info;
20     }
21
22     public MiddleMan(String name, String info) {
23         this.name = name;
24         this.info = info;
25     }
26
27     public MiddleMan() {
28     }
29
30     public synchronized void  set(String name,String info){
31         if (!flag){
32             try {
33                 super.wait();   //当前线程等待
34             } catch (InterruptedException e) {
35                 e.printStackTrace();
36             }
37         }
38            this.name = name;
39         try {
40             Thread.sleep(100);
41         } catch (InterruptedException e) {
42             e.printStackTrace();
43         }
44            this.info = info;
45         flag = false;   //重置标志位,让消费者消费
46         super.notify();  //使用Object的notify方法,让消费者线程被唤醒
47     }
48     public synchronized void get(){
49         if (flag){
50             try {
51                 super.wait();
52             } catch (InterruptedException e) {
53                 e.printStackTrace();
54             }
55         }
56         System.out.println(this.getName()+"-"+this.getInfo());
57         flag = true;
58         super.notify();  //唤醒线程
59     }
60 }

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

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

程序入口

|--运行结果

原文地址:https://www.cnblogs.com/twuxian/p/11331077.html

时间: 2024-10-22 09:20:31

Java 测试:创建两个线程,模拟对话,交替输出的相关文章

创建两个线程模拟火车站两个窗口售票程序

题目:创建两个线程模拟火车站两个窗口售票程序,窗口售票时间为1秒,两个窗口不能同时售票 #include<Windows.h> #include<iostream> using namespace std; //这是2个线程模拟买火车票的小程序 DWORD WINAPI Fun1Proc(LPVOID lpParameter);//thread data DWORD WINAPI Fun2Proc(LPVOID lpParameter);//thread data int inde

实现两个线程从0-100交替打印

分享一道多线程面试题,只是拿来练手的,这里通过两种方式去实现0-100交替打印,大家无聊的话,可以瞅两眼. 一.Synchronized实现: public class PrintNumberIncrInSynchronized { private static int number; private static final Object object = new Object(); public static void main(String[] args) { new Thread(()

java基础(26):Thread、线程创建、线程池

1. 多线程 1.1 多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程.一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序. 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 什么是多线程呢?即就是一个程序中有多个线程在同时执行.

多线程——范例:建立与启动两个线程 与 范例:显示调度器有多个不可预测的结果(Head First Java的例子)

//范例:建立与启动两个线程 public class ThreadTest implements Runnable{ public static void main(String[] args) { ThreadTest runner=new ThreadTest();//创建Runnable的实例 Thread alpha=new Thread(runner); Thread beta=new Thread(runner);//创建两个线程,使用相同的Runnable,即相同的任务 alph

java多线程回顾3:线程安全

1.线程安全问题 关于线程安全问题,有一个经典案例:银行取钱问题. 假设有一个账户,有两个线程从账户里取钱,如果余额大于取钱金额,则取钱成功,反之则失败. 下面来看下线程不安全的程序会出什么问题. 账户类: 1 public class Account { 2 3 public int balance = 10;//账户余额 4 5 6 7 //取钱的方法 8 9 public void draw(int money){ 10 11 if (balance >= money) { 12 13 /

java笔记线程两种方式模拟电影院卖票

1 public class SellTicketDemo { 2 public static void main(String[] args) { 3 // 创建三个线程对象 4 SellTicket st1 = new SellTicket(); 5 SellTicket st2 = new SellTicket(); 6 SellTicket st3 = new SellTicket(); 7 8 // 给线程对象起名字 9 st1.setName("窗口1"); 10 st2.

java多线程总结一:线程的两种创建方式及优劣比较

1.通过实现Runnable接口线程创建 (1).定义一个类实现Runnable接口,重写接口中的run()方法.在run()方法中加入具体的任务代码或处理逻辑. (2).创建Runnable接口实现类的对象. (3).创建一个Thread类的对象,需要封装前面Runnable接口实现类的对象.(接口可以实现多继承) (4).调用Thread对象的start()方法,启动线程 示例代码: [java] view plaincopy <span style="font-size:16px;&

java多线程总结一:线程的两种创建方式及比较

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

Java多线程-如何创建并运行线程

以下内容转自http://ifeve.com/creating-and-starting-java-threads/: Java线程类也是一个object类,它的实例都继承自java.lang.Thread或其子类. 可以用如下方式用java中创建一个线程: Tread thread = new Thread(); 执行该线程可以调用该线程的start()方法: thread.start(); 在上面的例子中,我们并没有为线程编写运行代码,因此调用该方法后线程就终止了. 编写线程运行时执行的代码