实验五 Java多线程程序设计

news/2024/12/29 11:37:07/

实验目的

  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);}});}@Overridepublic 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 > 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);}@Overridepublic 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.ppmy.cn/news/63143.html

相关文章

AI 工具合辑盘点(七)持续更新 之 AI 音频生成工具

AI 音频生成工具 想要不亲自录制&#xff0c;快速将文本转换为语音&#xff1f;AI 音频生成工具为你提供数千种语音选择&#xff0c;从“普通人”的声音到模仿演员、政治家或电影角色的合成声音&#xff0c;各种声音应有尽有 &#x1f5e3; AI 音频生成工具可用于创建商业用途…

移动应用中字体库的设计与实现

随着移动设备的普及&#xff0c;用户对于手机应用的字体需求也越来越高。字体是手机应用的重要组成部分&#xff0c;其美观度和可读性直接影响到用户的使用体验。因此&#xff0c;开发一款优秀的字体库是非常必要的。 在 APPCan 中&#xff0c;开发字体库的支持是非常重要的。下…

前端开发代码规范工具

规范化是前端工程化的一个重要部分。现在&#xff0c;有许多工具能够辅助我们实行代码的规范化,比如你一定知道的 ESLint 和 Prettier。 今天&#xff0c;来聊聊这些工具的工作原理和基本使用&#xff0c;了解它们是如何发挥作用的&#xff0c;以及如何更好地利用这些工具去规…

破解马赛克有多「容易」?

刷短视频时&#xff0c;估计大家都看过下面这类视频&#xff0c;各家营销号争相曝光「一分钟解码苹果笔刷背后内容」的秘密。换汤不换药&#xff0c;自媒体们戏称其为「破解马赛克」&#xff0c;殊不知让多少不明真相的用户建立起了错误的认知&#xff0c;也让苹果笔刷第 10086…

OpenFeign详解

OpenFeign概述 Feign Feign是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端。 Feign内置了Ribbon&#xff0c;用来做客户端负载均衡&#xff0c;去调用服务注册中心的服务。 Feign旨在使编写Java Http客户端变得更容易。 Feign是一个声明式WebService客户端&…

【Android】跟着chatGPT学习悬浮窗的实现

请实现Android里的悬浮窗&#xff0c;这个悬浮窗里有2个TextView 实现 Android 悬浮窗需要涉及到以下几个步骤&#xff1a; 创建一个悬浮窗口的布局&#xff0c;包含两个 TextView。 创建一个 Service&#xff0c;并在 Service 的 onCreate() 方法中创建悬浮窗口。 在悬浮窗口的…

iview-admin首页的图表数据渲染问题

iview-admin的首页有几个图表&#xff0c;应该是作者自己封装的&#xff0c;有个问题是在mounted时&#xff0c;从后台获取数据&#xff0c;应该把图表根据数据重新渲染一下。 <chart-bar id"myChart" style"height: 260px;" :value"barData"…

行为型模式-中介者模式

中介者模式 概述 一般来说&#xff0c;同事类之间的关系是比较复杂的&#xff0c;多个同事类之间互相关联时&#xff0c;他们之间的关系会呈现为复杂的网状结构&#xff0c;这是一种过度耦合的架构&#xff0c;即不利于类的复用&#xff0c;也不稳定。例如在下左图中&#xf…