实验五: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.hqwc.cn/news/194009.html

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

相关文章

未来 20 年 12 大发展趋势

未来 20 年 12 大发展趋势 周末闲来无聊&#xff0c;翻阅以前的材料&#xff0c;常读常新的感觉。 前言 跟30年后的我们相比&#xff0c;现在的我们就是一无所知。必须要相信那些不可能的事情&#xff0c;因为我们尚处于第一天的第一个小时——开始的开始。 技术都会有一个…

qsort函数使用方法总结

目录 一、qsort函数原型 二、compar参数 三、各种类型的qsort排序 1. int 数组排序 2. 结构体排序 3. 字符串指针数组排序 4. 字符串二维数组排序 四、回调函数 1. 什么是回调函数 2. 为什么要用回调函数&#xff1f; 3. 怎么使用回调函数&#xff1f; 4.下面是…

【MySQL--->视图】

文章目录 [TOC](文章目录) 一、概念二、操作三、视图特性 一、概念 视图是一个由插叙结果组成的虚拟表,基于表查询结果得到的表叫做视图,被查询的表叫做基表.基表和视图进行更新操作会互相影响. 二、操作 创建视图 将dept和emp两个基表的查询结果作为视图 更新基表会影响视…

MongoDB相关基础操作(库、集合、文档)

文章目录 一、库的相关操作1、查看数据库2、查看当前库3、创建数据库4、删除数据库 二、集合的相关操作1、查看库中所有集合2、创建集合2.1、显示创建2.2、隐式创建 3、删除集合 三、文档的相关操作1、插入文档1.1、插入单条文档1.2、插入多条文档1.3、脚本方式 2、查询文档3、…

鸿蒙:实现两个Page页面跳转

效果展示 这篇博文在《鸿蒙&#xff1a;从0到“Hello Harmony”》基础上实现两个Page页面跳转 1.构建第一个页面 第一个页面就是“Hello Harmony”&#xff0c;把文件名和显示内容都改一下&#xff0c;改成“FirstPage”&#xff0c;再添加一个“Next”按钮。 Entry Compone…

第 372 场 LeetCode 周赛题解

A 使三个字符串相等 求三个串的最长公共前缀 class Solution { public:int findMinimumOperations(string s1, string s2, string s3) {int n1 s1.size(), n2 s2.size(), n3 s3.size();int i 0;for (; i < min({n1, n2, n3}); i)if (!(s1[i] s2[i] && s2[i] s…

数据挖掘复盘——apriori

read_csv函数返回的数据类型是Dataframe类型 对于Dataframe类型使用条件表达式 dfdf.loc[df.loc[:,0]2]df: 这是一个DataFrame对象的变量名&#xff0c;表示一个二维的表格型数据结构&#xff0c;类似于电子表格或SQL表。 df.loc[:, 0]: 这是使用DataFrame的.loc属性来进行…

牛客网刷题笔记三 寻找第K大+两数之和+合并两个排序的链表+用两个栈实现队列

算法题牛客网NC88 寻找第K大 题目&#xff1a; 思路就是做个排序&#xff0c;要求时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn)&#xff0c;因此选用快排。代码&#xff1a; class Solution:def quickSort(self, a, start, end):if start > end:returnval a[start]…

《向量数据库指南》——亚马逊云科技向量数据库揭秘:点亮数据未来!

在我们讨论亚马逊云科技向量数据库之前,我们必须先搞懂向量数据库。 那么,向量数据库是什么呢?简单来说,向量数据库就是一种专门用于处理和查询向量数据的数据库。与传统数据库以表格形式组织和存储数据不同,向量数据库采用多维数值数组的形式处理和存储数据。它的主要目标…

和解电话(匿名电话)/情侣拉黑联系电话/虚拟号/虚拟中间号/拉黑联系项目代码

和解电话&#xff0c;又名匿名电话 使用中间号转接到被叫人&#xff0c;不显示呼叫人号码&#xff0c;类似美团隐私号 呼叫人A->中间号B->被叫人C 演示地址&#xff1a;微信打开(http://sms.test.4php.top/sms/phone) 实现代码如下 <section class"section&q…

CICD 持续集成与持续交付(2)

目录 gitlab 部署 jenkins 部署 配置 实时触发 自动化构建docker镜像 通过ssh插件交付任务 添加jenkins节点 RBAC pipeline jenkins结合ansible参数化构建 安装ansible 新建gitlab项目 jenkins新建项目playbook gitlab 部署 虚拟机最小需求&#xff1a;4G内存 4核cpu 下载&…

【HarmonyOS开发】配置开发工具DevEco Studio

1、下载 注意&#xff1a; 1、安装过程中&#xff0c;一定要自定义安装位置&#xff0c;包比较大&#xff0c;包比较大&#xff0c;包比较大&#xff01;&#xff01;&#xff01; 2、可以将该工具添加到右键中&#xff0c;否则&#xff0c;如果你的项目不是HarmonyOS&#xff…