实验五:Java多线程程序设计

一、线程接力

编写一个应用程序,除了主线程外,还有三个线程:first、second和third。first负责模拟一个红色的按钮从坐标(10,60)运动到(100,60);second负责模拟一个绿色的按钮从坐标(100,60)运动到(200,60)。third线程负责模拟一个蓝色的按钮从坐标(200,60)运动到(300,60)。

阅读并分析以下程序,将程序中的代码补充完整,编译并运行程序,查看结果。

package Demo01;import java.awt.*;
import java.awt.event.*;public class MoveButton extends Frame implements Runnable, ActionListener {// 用Thread类声明first,second,third三个线程对象Thread first, second, third;Button redButton, greenButton, blueButton, startButton;int distance = 10;MoveButton() {// 分别创建first,second,third三个线程,用当前窗口做为该线程的目标对象first = new Thread(this);second = new Thread(this);third = new Thread(this);redButton = new Button();greenButton = new Button();blueButton = new Button();redButton.setBackground(Color.red);greenButton.setBackground(Color.green);blueButton.setBackground(Color.blue);startButton = new Button("start");startButton.addActionListener(this);setLayout(null);add(redButton);redButton.setBounds(10, 60, 15, 15);add(greenButton);greenButton.setBounds(100, 60, 15, 15);add(blueButton);blueButton.setBounds(200, 60, 15, 15);add(startButton);startButton.setBounds(200, 100, 30, 30);setTitle("线程接力");setBounds(0, 0, 10, 200);setVisible(true);validate();addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0);}});}public void actionPerformed(ActionEvent e) {try {// 分别启动三个线程first.start();second.start();third.start();} catch (Exception exp) {}}public void run() {while (true) {// 判断当前占有CPU资源的线程是否是firstif (Thread.currentThread() == first) {moveComponent(redButton);try {Thread.sleep(20);} catch (Exception exp) {}}
// 判断当前占有CPU资源的线程是否是secondif (Thread.currentThread() == second) {moveComponent(greenButton);try {Thread.sleep(10);} catch (Exception exp) {}}
// 判断当前占有CPU资源的线程是否是thirdif (Thread.currentThread() == third) {moveComponent(blueButton);try {Thread.sleep(20);} catch (Exception e) {}}}}public synchronized void moveComponent(Component b) {if (Thread.currentThread() == first) {while (distance > 100 && distance <= 300)try {wait();} catch (Exception exp) {}distance = distance + 1;b.setLocation(distance, 60);if (distance >= 100) {b.setLocation(10, 60);notifyAll();}}if (Thread.currentThread() == second) {while ((distance >= 10 && distance < 100) || (distance >200 && distance <= 300))try {wait();} catch (Exception exp) {}distance = distance + 1;b.setLocation(distance, 60);if (distance > 200) {b.setLocation(100, 60);notifyAll();}}if (Thread.currentThread() == third) {while (distance >= 10 && distance < 200)try {wait();} catch (Exception exp) {}distance = distance + 1;b.setLocation(distance, 60);if (distance > 300) {distance = 10;b.setLocation(200, 60);notifyAll();}}}public static void main(String[] args) {new MoveButton().setLocationRelativeTo(null);}
}

二、线程的控制

编写一个程序,动画显示文本域中的字符串。在窗体的南面添加三个按钮,为程序添加线程控制功能,要求点击开始按钮(startBtn),线程开始启动,文字逐个显示,并且将按钮状态改变为禁用(因为线程不能重复启动);点击暂停按钮(pauseBtn),线程暂停,文字显示停止;点击恢复按钮(resumeBtn),线程恢复运行,文字继续显示。当线程执行完毕后,恢复开始按钮的状态为可用。程序运行界面如下图所示:

 

package Demo01;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.border.BevelBorder;public class RunnableDemo extends JFrame implements Runnable, ActionListener {private JTextArea textArea; // 文本域组件JLabel label;Button startBtn, pauseBtn, resumeBtn;Panel panel;Thread thread;boolean move = false;// 动画显示的文本字符串private String introduction = "现在大家已经对计算机很熟悉了,如今计算机的操作" + "系统可以同时执行多个任务,在听歌的同时能够打字、下载文件,在聊天窗口打"+ "字的时候,对方同时还能通过视频看到你;听到你。这一切都是使用多任务实现" + "的,Java语言使用多线程实现一个程序中的多个任务同时运行。程序员可以在程"+ "序中执行多个线程,每一个线程完成一个功能,并与其他线程并发执行,这种机" + "制被称为多线程。";public static void main(String args[]) {new RunnableDemo().setLocationRelativeTo(null); // 创建本类实例对象}public RunnableDemo() {setTitle("线程的控制");label = new JLabel("多线程简介:"); // 标签组件getContentPane().add(label, BorderLayout.NORTH);// 添加标签到窗体		textArea = new JTextArea("\t"); // 初始化文本域组件textArea.setBorder(new BevelBorder(BevelBorder.LOWERED));// 设置边框textArea.setLineWrap(true); // 设置自动折行getContentPane().add(textArea, BorderLayout.CENTER);// 添加文本域组件到文本框startBtn = new Button("开始");pauseBtn = new Button("暂停");resumeBtn =new Button("恢复");startBtn.addActionListener(this);pauseBtn.addActionListener(this);resumeBtn.addActionListener(this);panel = new Panel();panel.add(startBtn);panel.add(pauseBtn);panel.add(resumeBtn);getContentPane().add(panel, BorderLayout.SOUTH);setBounds(0, 0, 383, 225); // 设置窗体大小位置setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setVisible(true); // 显示窗体}/** Runnable接口方法,是线程的执行方法 */@Overridepublic void run() {textArea.setText("\t");String[] intros = introduction.split(""); // 将字符串分割为数组for (String ch : intros) { // ForEach遍历字符串数组while (!move) {try {synchronized (this) {wait();}} catch (InterruptedException e) {e.printStackTrace();}}textArea.append(ch); // 添加一个字符到文本域try {Thread.sleep(100); // 线程休眠0.1秒} catch (InterruptedException e) {e.printStackTrace();}}startBtn.setEnabled(true);}@Overridepublic void actionPerformed(ActionEvent e) {if (e.getSource() == startBtn) {thread = new Thread(this);thread.start();move = true;startBtn.setEnabled(false);} else if (e.getSource() == pauseBtn) {move = false;} else if (e.getSource() == resumeBtn) {move = true;synchronized (this) {notifyAll();}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/197454.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习基础】正则化

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;机器学习 欢迎订阅&#xff01;后面的内容会越来越有意思~ ⭐特别提醒&#xff1a;针对机器学习&#xff0c;特别开始专栏&#xff1a;机器学习python实战 欢迎订阅&am…

OpenCV图像处理、计算机视觉实战应用

OpenCV图像处理、计算机视觉实战应用 专栏简介一、基于差异模型模板匹配缺陷检测二、基于NCC多角度多目标匹配三、基于zxing多二维码识别四、基于tesseract OCR字符识别 专栏简介 基于OpenCV C分享一些图像处理、计算机视觉实战项目。不定期持续更新&#xff0c;干货满满&…

ExoPlayer架构详解与源码分析(9)——TsExtractor

系列文章目录 ExoPlayer架构详解与源码分析&#xff08;1&#xff09;——前言 ExoPlayer架构详解与源码分析&#xff08;2&#xff09;——Player ExoPlayer架构详解与源码分析&#xff08;3&#xff09;——Timeline ExoPlayer架构详解与源码分析&#xff08;4&#xff09;—…

Kafka入门教程与详解(一)

Kafka入门教程与详解&#xff08;一&#xff09; 一、Kafka入门教程 1.1 消息队列&#xff08;Message Queue) Message Queue消息传送系统提供传送服务。消息传送依赖于大量支持组件&#xff0c;这些组件负责处理连接服务、消息的路由和传送、持久性、安全性以及日志记录。消…

飞鼠异地组网工具实战之访问k8s集群内部服务

飞鼠异地组网工具实战之访问k8s集群内部服务 一、飞鼠异地组网工具介绍1.1 飞鼠工具简介1.2 飞鼠工具官网 二、本次实践介绍2.1 本次实践场景描述2.2 本次实践前提2.3 本次实践环境规划 三、检查本地k8s集群环境3.1 检查k8s各节点状态3.2 检查k8s版本3.3 检查k8s系统pod状态 四…

HTML5学习系列之标题和正文、描述性信息

HTML5学习系列之标题和正文、描述性信息 标题和正文标题段落 描述性信息强调注解备选上下标术语代码预定义格式缩写词编辑提示引用引述换行显示修饰非文本注解 总结 标题和正文 标题 按语义轻重排列&#xff1a;h1\h2\h3\h4\h5\h6 <h1>诗词介绍</h1> <h2>…

802.11ax-2021协议学习__$27-HE-PHY__$27.5-Parameters-for-HE-MCSs

802.11ax-2021协议学习__$27-HE-PHY__$27.5-Parameters-for-HE-MCSs 27.3.7 Modulation and coding scheme (HE-MCSs)27.3.8 HE-SIG-B modulation and coding schemes (HE-SIG-B-MCSs)27.5 Parameters for HE-MCSs27.5.1 General27.5.2 HE-MCSs for 26-tone RU27.5.3 HE-MCSs f…

系列一、JVM概述

一、概述 1.1、Java发展中的重大事件 1.2、虚拟机 vs Java虚拟机 1.2.1、虚拟机 1.2.2、Java虚拟机 1.2.3、Java虚拟机的作用 Java虚拟机是二进制字节码的运行环境&#xff0c;负责装载字节码到其内部&#xff0c;解释/编译为对应平台上的机器指令指令。每一条Java指令&#…

Linux进程间通信之匿名管道

文章目录 为什么要有进程间通信pipe函数共享管道原理管道特点管道的应用场景&#xff08;进程池&#xff09;ProcessPool.ccTask.hpp 为什么要有进程间通信 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 资源共享&#xff1a;多个进程之间共享同样的资源。 通…

ARM CoreLink CCN 互连总线介绍

NIC NOC CCI CMN CNN NI cmn-700 nic-700 ni-700 MLGB这都是啥玩意? 后期博文或视频将会更新这一系列。今天先温习一下CNN的概念,这是来自2014年的文章,然后稍微整理总结一番。 以下是正文… 现代主流和优质 ARM 片上系统 (SoC) 产品使用 CoreLink 缓存一致性网络 (CCN) 504…

NSSCTF第13页(2)

[HNCTF 2022 Week1]Challenge__rce 提示?hint 访问看到了源码 <?php error_reporting(0); if (isset($_GET[hint])) { highlight_file(__FILE__); } if (isset($_POST[rce])) { $rce $_POST[rce]; if (strlen($rce) < 120) { if (is_string($rce…

基于阿基米德优化算法优化概率神经网络PNN的分类预测 - 附代码

基于阿基米德优化算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于阿基米德优化算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于阿基米德优化优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xf…

国科大数据挖掘期末复习——聚类分析

聚类分析 将物理或抽象对象的集合分组成为由类似的对象组成的多个类的过程被称为聚类。由聚类所生 成的簇是一组数据对象的集合&#xff0c;这些对象与同一个簇中的对象彼此相似&#xff0c;与其他簇中的对象相异。 聚类属于无监督学习&#xff08;unsupervised learning&…

vue之浏览器存储方法封装实例

我们在项目中通常会对缓存进行一些操作&#xff0c;为了便于全局调用&#xff0c;会对缓存的设置、获取及删除方法进行封装成一个工具类。 首先我们在src目录下创建一个plugins文件夹&#xff0c;在plugins下创建cache文件夹并创建index.js&#xff0c;代码如下&#xff1a; c…

[Linux版本Debian系统]安装cuda 和对应的cudnn以cuda 12.0为例

写在前面 先检查自己有没有安装使用wget的命令&#xff0c;没有的话输入下面命令安装&#xff1a; apt-get install wget -y查看gcc的安装 sudo apt install gcc #安装gcc gcc --version #查看gcc是否安装成功 #若上述命令不成功使用下面的命令尝试之后再执行上面…

【数据结构算法(一)】递归篇(常见实例讲解)

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; ⭐本篇讲解实例&#xff1a; 斐波那契、兔子问题、猴子吃桃问题、跳台阶问题、汉诺塔、杨辉三角 ⭐用到的递归思想&#xff1a; 无记忆递归、记忆递归(重点掌握) 目录 一、斐波那契&#xff1a; ①无记忆多路递归&am…

【飞控调试】DJIF450机架+Pixhawk6c mini+v1.13.3固件+好盈Platinium 40A电调无人机调试

1 背景 由于使用了一种新的航电设备组合&#xff0c;在调试无人机起飞的时候遇到了之前没有遇到的问题。之前用的飞控&#xff08;Pixhawk 6c&#xff09;和电调&#xff08;Hobbywing X-Rotor 40A&#xff09;&#xff0c;在QGC里按默认参数配置来基本就能平稳飞行&#xff0…

【Linux】21、软中断、网络小包、SYN FLOOD 攻击、sar tcpdump

文章目录 一、通俗理解&#xff1a;从“取外卖”看中断二、软中断2.1 网卡收发数据包2.2 查看软中断和内核线程2.3 案例2.3.1 案例&#xff1a;动态库 sleep 导致软中断2.3.2 Nginx 进程的不可中断状态是系统的一种保护机制&#xff0c;可以保证硬件的交互过程不被意外打断。所…

SpringBoot使用DevTools实现后端热部署

&#x1f4d1;前言 本文主要SpringBoot通过DevTools实现热部署的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日一句&…

docker 安装mongodb 实现 数据,日志,配置文件外挂

docker 安装mongodb 实现数据&#xff0c;日志&#xff0c;配置文件外挂 1 背景 最近开发了一个评论系统之前用mysql来存储数据&#xff0c;但是考虑到后期业务增大访问量也会增大&#xff0c;为了兼容这种高并发的场景&#xff0c;因此经过多方面的考虑&#xff0c;我们最终…