实验五 Java多线程程序设计

news2024/12/28 21:47:38

实验目的

  1. 掌握Runnable接口实现多线程的方法
  2. 掌握Thread类实现多线程的用法
  3. 掌握Java语言中多线程编程的基本方法

实验内容

  1. 线程接力(45分)

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

第一步

以下是idea jdk1.8的教程 eclipse同理

新建一个MoveButton类

 

第二步把代码覆盖粘上去

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

class MoveButton extends Frame implements Runnable, ActionListener {
	Thread first, second, third;    //用Thread类声明first,second,third三个线程对象
	Button redButton, greenButton, blueButton, startButton;     //声明四个按钮
	JLabel copyright;        //版权信息
	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);
		copyright = new JLabel("xxxxxxx写自己的信息xxxxxxxx");
		add(copyright);
		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(10, 100, 30, 30);
		copyright.setBounds(100, 100, 240, 30);
		setTitle("线程接力");
		setBounds(0, 0, 400, 200);
		setVisible(true);
		validate();
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		try {
			//分别启动三个线程
			first.start();
			second.start();
			third.start();
		} catch (Exception exp) {
		}
	}

	public void run() {
		while (true) {
			//判断当前占有CPU资源的线程是否是first
			if (Thread.currentThread() == first) {
				moveComponent(redButton);
				try {
					Thread.sleep(20);
				} catch (Exception exp) {
				}
			}
			//判断当前占有CPU资源的线程是否是second
			if (Thread.currentThread() == second) {
				moveComponent(greenButton);
				try {
					Thread.sleep(10);
				} catch (Exception exp) {
				}
			}
			//判断当前占有CPU资源的线程是否是third
			if (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 > 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 > 300)
				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),线程恢复运行,文字继续显示。当线程执行完毕后,恢复开始按钮的状态为可用。

第一步新键RunnableDemo类

 第二步把代码粘上去覆盖掉

import java.awt.*;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.border.BevelBorder;
public class RunnableDemo extends JFrame implements Runnable, ActionListener {

    private JTextArea textArea; //文本域组件
    JLabel label;
    JButton startBtn;
    JButton pauseBtn;
    JButton resumeBtn;
    Panel panel;
    Thread thread;
    boolean move = false;

    //动画显示的文本字符串
    private final String introduction = "现在大家已经对计算机很熟悉了,如今计算机的操作"
            + "系统可以同时执行多个任务,在听歌的同时能够打字、下载文件,在聊天窗口打"
            + "字的时候,对方同时还能通过视频看到你;听到你。这一切都是使用多任务实现"
            + "的,Java语言使用多线程实现一个程序中的多个任务同时运行。程序员可以在程"
            + "序中执行多个线程,每一个线程完成一个功能,并与其他线程并发执行,这种机"
            + "制被称为多线程。";

    public RunnableDemo() {
        setTitle("线程的控制");
        label = new JLabel("多线程简介:xxxxxxx写自己的信息xxxxxxxx");//标签组件
        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 JButton("开始");
        pauseBtn = new JButton("暂停");
        resumeBtn = new JButton("恢复");
        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(WindowConstants.EXIT_ON_CLOSE);
        setVisible(true); //显示窗体
    }

    @Override   //Runnable接口方法,是线程的执行方法.
    public 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);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == startBtn) {
            thread = new Thread(this);
            thread.start();
            move = true;
        } else if (e.getSource() == pauseBtn) {
            move = false;
        } else if (e.getSource() == resumeBtn) {
            move = true;
            synchronized (this){
                notifyAll();
            }
        }
    }

    public static void main(String[] args) {
        new RunnableDemo().setLocationRelativeTo(null); //创建本类实例对象
    }
}

这里改名字 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL基础(二十四)索引的数据结构

1 为什么使用索引 顺序查询和数据使用二叉树结构再进行查询,如图&#xff1a; 2 索引及其优缺点 2.1 索引概述 MySQL官方对索引的定义为&#xff1a;索引&#xff08;Index&#xff09;是帮助MySQL高效获取数据的数据结构。 **索引的本质&#xff1a;**索引是数据结构。你…

第九章 使用Vsftpd服务传输文件

文章目录 第九章 使用Vsftpd服务传输文件一、文件传输协议1、FTP介绍2、FTP工作模式 二、Vsftpd服务程序1、安装Vsftpd服务程序2、防火墙配置3、过滤注释信息并通过重定向符写回原始的主配置文件4、Vsftpd服务程序常用的参数以及作用5、匿名访问模式&#xff08;1&#xff09;、…

【自己更换模型】如何用 Serverless 一键部署 Stable Diffusion?

作者&#xff1a;寒斜 上一篇讲了如何使用 Serverless Devs 和函数计算快速体验部署 Stable Diffusion&#xff0c;本篇继续聊聊如何解决动态模型加载的问题&#xff0c;从玩起来到用起来。 思路 其实很简单&#xff0c; 我们只需要将镜像里面的动态路径映射到 NAS [ 1] 文件…

为什么调度也需要“血缘分析”和“影响分析”?

摘要&#xff1a;数据治理中经常要遇表或者字段级“血缘分析”和“影响分析”&#xff0c;但是真正在数据ETL调度操作过程中使用影响和血缘分析频繁&#xff0c;看白鲸开源的WhaleStudio如何解决这个难题。 提到“血缘分析”和“影响分析”&#xff0c;普通开发者第一印象就是数…

【Java EE 初阶】线程池简介及实现过程

目录 1.线程池是什么&#xff1f; 2.为什么要使用线程池&#xff1f; 3.如何使用线程池 1.JDK给我们提供了一些方法来创造线程池 4.设计模式之工厂模式 1.工厂模式用途 5.自定义一个线程池 1.可以提交任务到线程池&#xff0c;那么就会有一种数据结构来保存我们提交的任…

java lambda表达式详解

一、Lambda初识 我们知道&#xff0c;在Java中&#xff0c;接口是不能实例化的&#xff0c;但是接口对象可以指向它的实现类对象。如果接口连实现对象都没有呢&#xff1f;那还可以使用匿名类的方式&#xff0c;如下: public class JavaTest { public static void main(Strin…

jenkins,gitlab,实时构建推送

首先jdk&#xff0c;jenkins安装好&#xff0c;新版jenkins不支持jdk8 然后安装环境maven&#xff0c;git 环境配置 插件安装 gitlab插件 Build Authorization Token Root插件 插件环境整好之后新建个任务 源码管理&#xff0c;填入仓库https地址&#xff0c;添加git…

大势智慧软硬件技术答疑第一期

1.重建大师生成的实景三维模型&#xff0c;模型周边的道路植物被压平了&#xff0c;怎么保留植物道路原有形状&#xff1f; 答&#xff1a;这个是单体化生成的地理实体场景&#xff0c;会把地物压平&#xff0c;可以用模方将单体化的模型加入到osgb中。 2.直接导入空三的话这个…

采用docker部署时kafka共享zookeeper的网络配置

采用docker部署kafka、zookeeper&#xff0c;一般的做法是创建一个docker网络&#xff0c;然后kafka、zookeeper都使用这个网络。问题是&#xff0c;我部署到生产环境的时候&#xff0c;这种做法被禁止了。原因是添加了这个docker网络以后&#xff0c;服务器就无法访问了。该服…

Es读写调优、深度分页

写入 ES支持四种对文档的数据写操作 create&#xff1a;如果在PUT数据的时候当前数据已经存在&#xff0c;则数据会被覆盖&#xff0c;如果在PUT的时候加上操作类型create&#xff0c;此时如果数据已存在则会返回失败&#xff0c;因为已经强制指定了操作类型为create&#xf…

Spring核心 AOP

1.什么是AOP&#xff1f; AOP&#xff08;Aspect Orient Programming&#xff09;&#xff0c;直译过来就是面向切面编程。AOP是一种编程思想&#xff0c;是面向对象编程&#xff08;OOP&#xff09;的一种补充。面向对象编程将程序抽象成各个层次的对象&#xff0c;而面向切面…

【笔试强训选择题】Day9.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 文章目录…

open3d Image和numpy互转,PointCloud和numpy互转

目录 1. open3d.geometry.Image转numpy 2. numpy 转 open3d.geometry.Image 3. numpy转PointCloud 4. PointCloud转numpy 1. open3d.geometry.Image转numpy np_x np.asarray(x) # (h,w,3) import numpy as np import matplotlib.pyplot as plt import matplotlib.image…

鸿蒙Hi3861学习十-Huawei LiteOS-M(消息队列)

一、简介 消息队列&#xff0c;是一种常用于任务间通信的数据结构&#xff0c;实现了接收来自任务或中断的不固定长度的消息&#xff0c;并根据不同的接口选择传递消息是否存放在自己空间。任务能够从队列里面读取消息&#xff0c;当队列中的消息是空时&#xff0c;挂起读取任务…

EC6108V9/V9C-Hi3798MV100-当贝纯净桌面-卡刷固件包

EC6108V9&#xff0f;V9C-Hi3798MV100-当贝纯净桌面-卡刷固件包-内有教程 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff1b; 4、大量精简内置的没用的软…

C#学习笔记--实现一个可以重复权重并且能够自动排序的容器--MultiplySortedSet

目录 前言SortedSetC#自带类型自定义类SortedSet权值重复 需求自定义容器 -- MultiplySortedSet核心实现思路 MultiplySortedSet 使用C#自带类型自定义类 前言 最近需要在C#中实现一个功能 有一个容器&#xff0c;该容器能自动对里面的元素进行排序&#xff0c;类似C的优先队列…

fast中user_id如何显示user表中的名称_关联模型

问题&#xff1a;编辑框内的user_id显示的是nickname 列表里如何显示nickname或是username 解决方案如下&#xff1a; 需要更改3个地方&#xff0c;控制器&#xff0c;模型&#xff0c;js文件 1.控制器index list($where, $sort, $order, $offset, $limit) $this->build…

ES6D: 利用对称性进行高效的6D姿态检测

利用对称性进行高效的6D姿态检测 本文参考自CVPR2022的这篇文章&#xff1a;ES6D: A Computation Efficient and Symmetry-Aware 6D Pose Regression Framework Github链接为&#xff1a;https://github.com/GANWANSHUI/ES6D 介绍 在6D姿态检测中&#xff0c;一些具备对称性的…

米哈游的春招实习面经,问的很基础

米哈游的春招实习面经&#xff0c;主要考察了java操作系统mysql网络&#xff0c;这四个方面。 面试流程&#xff0c;共1小时&#xff0c;1min自我介绍&#xff0c;20min写题&#xff0c;剩下问题基础知识。 Java String&#xff0c;StringBuilder&#xff0c; StringBuffer区…

注意力模型

如果拿机器翻译来解释这个分心模型的Encoder-Decoder框架更好理解&#xff0c;比如输入的是英文句子&#xff1a;Tom chase Jerry&#xff0c;Encoder-Decoder框架逐步生成中文单词&#xff1a;“汤姆”&#xff0c;“追逐”&#xff0c;“杰瑞”。 在翻译“杰瑞”这个中文单词…