首页 > 编程语言 >Java程序设计-实验五 Java多线程程序设计

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

时间:2023-05-09 22:01:04浏览次数:40  
标签:Java Thread 60 add 线程 new 程序设计 多线程

目的

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多线程编程非常重要,能够提高程序运行效率,但同时也需要注意线程之间的协作和控制,避免死锁。

标签:Java,Thread,60,add,线程,new,程序设计,多线程
From: https://www.cnblogs.com/moeyur/p/17386429.html

相关文章

  • JAVA知识点总结1
    目录1.关键字2.数据类型3.运算符4.流程控制语句4.1ifelse4.2Scanner类从键盘获取数据4.3获取一个随机数4.4switch-case4.5for循环4.6while循环4.7do-while循环5.数组5.1一维数组的基本使用5.2二维数组的基本使用5.3数组的常见操作(特征值统计、......
  • 编程打卡:面向对象程序设计测试
    面向对象程序设计测试#include<iostream>#include<iomanip>usingnamespacestd;classPoint{protected:doublex,y;public:Point(doublea=0,doubleb=0):x(a),y(b){cout<<"Pointconstructorcalled\n";......
  • JAVA的线程池随笔
    线程池基本概念概念:线程池主要是控制运行线程的数量,将待处理任务放到等待队列,然后创建线程执行这些任务。如果超过了最大线程数,则等待。优点:线程复用:不用一直new新线程,重复利用已经创建的线程来降低线程的创建和销毁开销,节省系统资源。提高响应速度:当任务达到时,不用创建新的......
  • 学习JavaScript数据结构与算法 第八章
    八,字典和散列表8.3ES2015Map类ECMAScript2015新增了Map类。constmap=newMap();map.set('Gandalf','[email protected]');map.set('John','[email protected]');map.set('Tyrion','[email protected]');......
  • 学习JavaScript数据结构与算法 第七章
    7.集合7.4ESMAScript2015---Set类ECMAScript2015新增了Set类作为JavaScriptAPI的一部分。我们可以基于ES2015的Set开发我们的Set类。constset=newSet()set.add(1)console.log(set.values())//@iteratorconsole.log(set.has(1))console.log(set......
  • Python多线程(multithreading)
    1.threading模块Python3线程中常用的两个模块为:_thread,threading(推荐使用).thread模块已被废弃,为了兼容性,Python3将thread重命名为_thread,即通过标准库_thread和threading提供对线程的支持。_thread提供了低级别的、原始的线程以及一个简单的锁,它相比于threading模块的功能还......
  • Method com/mysql/jdbc/JDBC4ResultSet.getObject(Ljava/lang/String;Ljava/lang/Clas
      mybatis-plus生成的日期类型默认是localdatetime,数据库是datetime,按道理转换应该可以,我又不想把实体类转换成date查看依赖<--locadate/locadatetime的时间依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-ty......
  • 使用java restclient连接elasticsearch
    java连接es方式有transport、restclient、javaclient方式。官方最新标的transport和restclient方式都已经过时了,这里用的es7还是以restclient方式进行连接测试。javaclient是es7.15之后推出的。下面开始使用HighLevelJavaRESTClient。maven依赖org.elasticsearch.cl......
  • javascript函数声明和函数表达式
    JavaScript中定义函数最常用的方式是函数声明和函数表达式。这两种技术非常相似,有时甚至难以区分,但在后续章节中可以看到,它们之间还是存在着微妙的区别。JavaScript定义函数最基本方式是函数声明,如下图:正如你所见,每个函数声明以强制性的function开头,其后紧接着强制性的函数名,以及......
  • JavaScript 正则表达式
    正则表达式RegularExpression在编程语言中,正则表达式用于匹配指定的字符串。如果想要在字符串Thedogchasedthecat中匹配到the这个单词,可以使用如下正则表达式:/the/。注意,正则表达式中不需要引号。使用测试方法TestMethodJavaScript中有多种使用正则表达式的方法......