实验五 Java多线程程序设计

yizhihongxing

目的

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)。

2. 线程的控制(45分)

要求:编写一个程序,动画显示文本域中的字符串。在窗体的南面添加三个按钮,为程序添加线程控制功能。

点击开始按钮(startBtn),线程开始启动,文字逐个显示,并且将按钮状态改变为禁用(因为线程不能重复启动)
点击暂停按钮(pauseBtn),线程暂停,文字显示停止
点击恢复按钮(resumeBtn),线程恢复运行,文字继续显示
当线程执行完毕后,恢复开始按钮的状态为可用。

线程接力

import javax.swing.*;
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(10, 100, 30, 30);

        JLabel label1 = new JLabel("your name   不啦不啦不啊咯");
        add(label1);
        label1.setBounds(50, 105, 150, 25);

        setTitle("线程接力");
        setBounds(0, 0, 400, 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资源的线程是否是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>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<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);
    }
}
程序运行截图

自己截图粘贴进markdown

实验总结

“线程接力”体现了Java多线程编程的线程切换特性,通过三个线程对一个组件进行移动,实现了多个线程间的协同作用。

线程的控制

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("多线程简介: your name   不啦不啦不啊咯"); // 标签组件
        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接口方法,是线程的执行方法
     */
    @Override
    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;
			startBtn.setEnabled(false);

        } else if (e.getSource() == pauseBtn) {
        	move=false;
        } else if (e.getSource() == resumeBtn) {
        	move=true;
        	synchronized (this) {
				notifyAll();
			}
        }
    }
}

程序运行截图

自己截图粘贴进markdown

实验总结

这个实例体现了Java多线程编程的线程控制特性,通过线程的控制实现了动画效果的实时调整。
Java多线程编程非常重要,能够提高程序运行效率,但同时也需要注意线程之间的协作和控制,避免死锁。

原文链接:https://www.cnblogs.com/moeyur/p/17386429.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:实验五 Java多线程程序设计 - Python技术站

(0)
上一篇 2023年5月10日
下一篇 2023年5月10日

相关文章

  • Java日常练习题,每天进步一点点(33)

    下面我来详细讲解“Java日常练习题,每天进步一点点(33)”。 问题描述 本题目要求我们使用Java语言编写程序,实现一个计算器,可以进行加减乘除四个基本运算。 题目分析 对于这个题目,我们可以考虑使用面向对象的编程思想,将计算器看作一个对象,然后为计算器设计四个基本的操作方法。 编程实现 先定义一个Calculator类,其中包含四个方法add、sub、…

    Java 2023年5月20日
    00
  • Java线程等待用法实例分析

    Java线程等待用法实例分析 在Java编程中,线程等待是掌握多线程知识的重要一环。当在某些情况下需要进行线程同步、控制程序执行顺序时,常常需要使用线程等待。本文将详细讲解Java线程等待的用法,并通过两个实例对其进行示例说明。 等待与通知 在线程中,等待与通知是两个相互关联的概念。等待指的是线程暂停自身的执行,并且进入等待状态,等待系统发出通知,来唤醒其继…

    Java 2023年5月18日
    00
  • Java陷阱之慎用入参做返回值详解

    在Java编程中,我们经常需要将方法的参数作为返回值返回。然而,这种做法可能会导致一些陷阱,特别是在多线程环境下。在本文中,我们将详细讲解“Java陷阱之慎用入参做返回值”的完整攻略,并提供两个示例来说明这个过程。 问题描述 在Java编程中,我们经常需要将方法的参数作为返回值返回。例如,我们可能会编写以下代码: public int increment(i…

    Java 2023年5月18日
    00
  • 微信小程序中转义字符的处理方法

    当在微信小程序中使用文本时,可能会遇到需要处理特殊字符的情况,例如 HTML 中的 <, > ,& 等字符。这些字符可能会干扰浏览器的解析,导致不良的显示效果或安全问题。因此,在小程序中需要对这些字符进行转义,使之具有普通文本的意义而不被解析。 常见的转义字符有以下几种: & 符号转义为 &amp; < 符号转义为 …

    Java 2023年5月23日
    00
  • 深入了解Java内部类的用法

    来给大家介绍一下深入了解Java内部类的用法的攻略。 什么是Java内部类 Java内部类是定义在另一个类中的类,它可以访问外部类的所有成员和方法,而且可以与外部类进行私有访问和更好地封装性。Java的内部类分为四种:成员内部类、静态内部类、局部内部类和匿名内部类。 成员内部类 成员内部类即在类中定义的类,其特点是具有与外部类相同的访问权限,即public,…

    Java 2023年5月26日
    00
  • 什么是Java代理?

    什么是Java代理? Java代理是一种设计模式,它允许在不改变目标对象的情况下代理对象与目标对象交互。代理对象可以在执行目标对象之前或之后执行其他操作,在不影响目标对象的情况下维护目标对象的状态。Java中有两种类型的代理:静态代理和动态代理。 静态代理 静态代理是在自己的类中实现代理的一种方式。创建一个代理类,通过实现与目标对象相同的接口来实现代理。使用…

    Java 2023年5月11日
    00
  • Idea开发工具之SpringBoot整合JSP的过程

    接下来我会详细讲解在Idea开发工具中如何整合SpringBoot和JSP。 准备工作 在开始之前,确保你已经完成以下准备工作: 安装了JDK和Idea开发工具。 创建一个SpringBoot项目。 确保pom.xml中已经添加了对于Spring Web和Tomcat的依赖。 整合JSP 第一步:在pom.xml中添加依赖 在pom.xml中添加以下依赖: …

    Java 2023年6月15日
    00
  • 初识MyBatis及基本配置和执行

    MyBatis 是一款开源的持久层框架,它支持自定义 SQL、存储过程以及高级映射。在这里介绍如何初识 MyBatis 并配置基本环境,还有执行一些基本的操作。 一、初识MyBatis MyBatis 是一款持久层框架,因为它能将程序中的 Java 对象映射到数据库中的表,从而让你可以使用类似于面向对象的思想来管理数据。在这里我们将使用 MyBatis SQ…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部