实验目的:

(1)了解进程和线程的概念
(2)了解多线程编程的特点
(3)利用Thread类和Runnable接创建多线程类
(4)掌握线程类的常用方法
(5)掌握多线程同步的方法

实验内容:

1、利用多线程类实现20个偶数和20个奇数的随机输出。
2、利用多线程编程实现多个窗口卖票的问题:
(1)三个窗口同时各卖10张票;
(2)三个窗口共同卖10张票。
3、编写多线程程序,实现生产者、消费者线程,并实现线程的同步:
(1)生产者线程产生20个数,消费者线程输出生产者线程产生的这20个数。
(2)使用线程的同步与协调机制使二者达到如此效果:产生一个数,取出一个数。

1、利用多线程类实现20个偶数和20个奇数的随机输出

//1.继承Thread
package sdut.cn;class EvenOddThread extends Thread {int value;public EvenOddThread(int value, String name) {super(name);this.value = value;}@Overridepublic void run() {for (int i = 0; i < 20; i++) {System.out.println(Thread.currentThread().getName() + "--" + value);value += 2;}}
}public class Main {public static void main(String[] args) {EvenOddThread evenThread = new EvenOddThread(1, "奇数线程");EvenOddThread oddThread= new EvenOddThread(0, "偶数线程");evenThread.start();oddThread.start();}
}
//2.利用Runnable接口
package sdut.cn;class EvenOddRunnable implements Runnable {int value;public EvenOddRunnable(int value) {this.value = value;}@Overridepublic void run() {for (int i = 0; i < 20; i++) {System.out.println(Thread.currentThread().getName() + "--" + value);value += 2;}}}public class Main {public static void main(String[] args) {EvenOddRunnable evenRunnable = new EvenOddRunnable(1);EvenOddRunnable oddRunnable = new EvenOddRunnable(0);Thread t1 = new Thread(evenRunnable, "奇数线程");Thread t2 = new Thread(oddRunnable, "偶数线程");t1.start();t2.start();}}

2、利用多线程编程实现多个窗口卖票的问题:

(1)三个窗口同时各卖10张票

package sdut.cn;class TicketRunnable implements Runnable {private int num = 1;@Overridepublic void run() {while (num <= 10) {System.out.println(Thread.currentThread().getName() + "正在销售第" + num + "号票");num++;}}}public class Main {public static void main(String[] args) {TicketRunnable tr1 = new TicketRunnable();TicketRunnable tr2 = new TicketRunnable();TicketRunnable tr3 = new TicketRunnable();Thread t1 = new Thread(tr1, "窗口1");Thread t2 = new Thread(tr2, "窗口2");Thread t3 = new Thread(tr3, "窗口3");t1.start();t2.start();t3.start();}}

(2)三个窗口共同卖10张票

package sdut.cn;class TicketRunnable implements Runnable {private int num = 1;@Overridepublic void run() {while(num <= 10) {//建议<=10000这样效果明显System.out.println(Thread.currentThread().getName() + "正在销售第" + num + "号票");num++;}}
}public class Main {public static void main(String[] args) {TicketRunnable ticketRunnable = new TicketRunnable();Thread t1 = new Thread(ticketRunnable, "窗口1");Thread t2 = new Thread(ticketRunnable, "窗口2");Thread t3 = new Thread(ticketRunnable, "窗口3");t1.start();t2.start();t3.start();}
}

3、编写多线程程序,实现生产者、消费者线程,并实现线程的同步:

(1)生产者线程产生20个数,消费者线程输出生产者线程产生的这20个数。

package sdut.cn;class Buffer {int value[];public int[] getValue() {return value;}public void setValue(int[] value) {this.value = value;}}class SetThread extends Thread {Buffer buffer;int temp[] = new int[25];public SetThread(Buffer buffer) {super();this.buffer = buffer;}@Overridepublic void run() {for (int i = 0; i < 20; i++) {temp[i] = i;System.out.println("生产商品" + i);}buffer.setValue(temp);}
}class GetThread extends Thread {Buffer buffer;public GetThread(Buffer buffer) {super();this.buffer = buffer;}@Overridepublic void run() {int[] temp = buffer.getValue();for(int i = 0; i < 20; i++) {System.out.println("消费商品" + temp[i]);}}
}public class Main {public static void main(String[] args) {Buffer buffer = new Buffer();SetThread setThread = new SetThread(buffer);GetThread getThread = new GetThread(buffer);setThread.start();getThread.start();}
}

(2)使用线程的同步与协调机制使二者达到如此效果:产生一个数,取出一个数。

package sdut.cn;class Buffer {int value;boolean flag = false;public synchronized int getValue() {if (!flag) {try {wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("消费商品" + value);flag = false;notify();return value;}public synchronized void setValue(int value) {if(flag) {try {wait();} catch (InterruptedException e) {e.printStackTrace();}}this.value = value;System.out.println("生产商品" + value);flag = true;notify();}}class SetThread extends Thread {Buffer buffer;public SetThread(Buffer buffer) {super();this.buffer = buffer;}@Overridepublic void run() {for (int i = 0; i < 20; i++) {buffer.setValue(i);}}
}class GetThread extends Thread {Buffer buffer;public GetThread(Buffer buffer) {super();this.buffer = buffer;}@Overridepublic void run() {for (int i = 0; i < 20; i++) {buffer.getValue();}}
}public class Main {public static void main(String[] args) {Buffer buffer = new Buffer();SetThread setThread = new SetThread(buffer);GetThread getThread = new GetThread(buffer);setThread.start();getThread.start();}
}

实验七多线程编程_JAVA相关推荐

  1. linux多线程求和_(TCP IP网络编程)实验七 多线程编程

    一.实验目的 (1) 理解线程和进程的联系和区别: (2) 掌握Linux下和Windows下创建线程的方法: (3) 掌握Linux下和Windows下线程同步的方法: (4) 使用多线程机制实现L ...

  2. 实验七 MapReduce编程进阶

    实验七 MapReduce编程进阶 答案在链接里https://blog.csdn.net/weixin_45818379/article/details/117790528

  3. 实验七 字符串 编程题 1. 飞来飞去

    实验七 字符串 编程题 1. 飞来飞去 [问题描述] 松雅作为一位商业人士,经常需要在天津和深圳之间飞来飞去,因为在这两个城市,她有多间旅馆.当然在冬天她更愿意从天津飞到深圳,因为深圳更暖和.她实在是 ...

  4. java多线程编程_Java多线程编程实战指南+设计模式篇.pdf

    Java多线程编程实战指南+设计模式篇.pdf 对Java架构技术感兴趣的工程师朋友们可以关注我,转发此文后私信我"Java"获取更多Java编程PDF资料(附送视频精讲) 关注我 ...

  5. java多线程编程_Java多线程编程

    本文主要对Java多线程编程进行深入研究.本文通过查看源代码及参考资料等方式研究.参考文章: Java多线程编程深入详解. 由问题入手: 问题1: 2种创建Thread的方式都是实现run()方法,但 ...

  6. java实验Java面向对象编程_Java实验项目 面向对象编程.doc

    Java实验项目 面向对象编程 Java实验项目二 面向对象编程 第1部分 类与对象 [实验目的] 熟悉Java面向对象程序设计的基本思想. 掌握类与对象的定义及使用方法. 掌握package语句与i ...

  7. Java实验8 多线程编程

    实验内容: (1)编程模拟售票系统,模拟多个窗口(至少4个)同时出售100张车票的情况:用实现Runnable接口的方法实现多线程. 程序设计思路: 利用Runnable接口来创建 程序代码: pac ...

  8. java实验Java面向对象编程_java 实验三 面向对象程序设计(无脑实验系列)

    实验7 运算符重载 (1)定义日期类,重载 "++"和"--"运算符,使之能处理两个日期类对象自增和自减运算,并且自增和自减又分为前缀和后缀运算.(可继续完善. ...

  9. 七. 多线程编程11.线程的挂起、恢复和终止

    有时,线程的挂起是很有用的.例如,一个独立的线程可以用来显示当日的时间.如果用户不希望用时钟,线程被挂起.在任何情形下,挂起线程是很简单的,一旦挂起,重新启动线程也是一件简单的事. 挂起,终止和恢复线 ...

最新文章

  1. Anaconda使用
  2. 图像缩放算法_技术专栏|基于无人机LK光流算法的适用性及其优化方法探究
  3. 16_非监督学习、k-means 4阶段、kmeans API、Kmeans性能评估指标、案例
  4. Anaconda和conda——关于python的数据科学开发环境,数据科学必备的十大Python库
  5. 【优化预测】基于matlab鲸鱼算法优化LSSVM预测【含Matlab源码 104期】
  6. Linux操作系统基本使用知识
  7. 纠错码与魔术(一)——纠错码与汉明码简介
  8. 贝叶斯数据分析--概论
  9. 栈和队列的共同点和不同点
  10. xbox360手柄连主机
  11. 如何防止超级节点“同谋”作恶?
  12. 《万人如海一身藏》书摘
  13. JS学习108-161
  14. 罗技Master 3 滚轮阻尼失效-解决方法
  15. CoreDNS篇8-健康检查
  16. 上海亚商投顾:A股缩量调整 AIGC、Web3.0概念抢眼
  17. SCSI/iSCSI及SAS、NAS、SAN的基本介绍
  18. HTML JS获取当前页面URL
  19. 什么是嵌入式编程?如何入门和提高?
  20. python收集参数_第5.2节 Python的函数参数收集

热门文章

  1. day24 面向对象与实例属性
  2. 猿类如何捕获少女心--难以琢磨的try-catch
  3. Spring AOP + AspectJ Annotation Example---reference
  4. 【行业报告】基于社交图谱关系的反欺诈产品应用——青云
  5. 【Python】pymysql基础:数据库操作
  6. Transformer 模型详解
  7. Transformer结构详解(有图,有细节)
  8. 这些deep learning(rnn、cnn)调参的经验值得分享
  9. 以太坊开发实战:通过truffle-contract与智能合约交互
  10. jvm性能调优实战 - 35电商APP后台系统如何对Full GC进行深度优化