首页 > 编程语言 >Java实验-Swing 简单多线程实验

Java实验-Swing 简单多线程实验

时间:2023-03-02 13:34:57浏览次数:38  
标签:Java name 实验 new import 多线程 ascription panel JTextField

实验要求:

多线程是生活中常见的现象,我们要让计算机程序同时做N件事,就可以通过多线程实现:

如图所示,分别用Thread和Runnable两种方法各开2条线程,实现如下界面,每条线程的数字都会数数字,从A0-A100,B0-B100,C0-C100,D0-D100,周而复始。

请用Java图形界面的知识,编写以上软件。

代码:

--JavaMain.java文件中的三个class:

package com.junlin.exer9;
import com.junlin.exer9.MyFrame;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JTextField;
import java.awt.Color;

/**
 * @Description:
 * @author: junlin623
 * @create: 2022-11-20 23:44
 */

public class JavaMain {

    public static void main(String[] args) {
        MyFrame frame = new MyFrame("xxx");

        MyThread T_A = new MyThread("A", frame.ttext1, Color.blue, 0.5);
        MyThread T_B = new MyThread("B", frame.ttext2, Color.green, 0.3);
        MyRunnable R_A = new MyRunnable("A", frame.rtext1, Color.red, 0.6);
        MyRunnable R_B = new MyRunnable("B", frame.rtext2, Color.gray, 0.8);

        T_A.start();
        T_B.start();
        new Thread(R_A).start();
        new Thread(R_B).start();

    }
}
//自定义继承Thread类的线程类
class MyThread extends Thread {
    private String name;  //线程名称
    private JTextField ascription;  //这个线程控制的文本控件
    private int cnt = 0;  //计数
    private Color textColor;  //文本颜色
    private double gap;  //每次刷新的时间间隔
    public MyThread(String name, JTextField ascription, Color color, double gap) {
        this.name = name;
        this.ascription = ascription;
        this.cnt = 0;
        this.textColor = color;
        this.ascription.setForeground(this.textColor);
        this.gap = gap;
    }
    @Override
    public void run() {
        while(true) {
            //System.out.println("Thread" + this.name + ":" + this.cnt);
            this.ascription.setText("Thread" + this.name + ":" + this.cnt);
            //休眠指定时间,这样可以让每个文本框速度不同的更新
            try {
                Thread.sleep((int)(this.gap * 1000));
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            //使用这行代码可以立即刷新控件的内容,而不用回到主线程再刷新
            this.ascription.paintImmediately(this.ascription.getBounds());
            cnt = (cnt + 1) % 100;
        }

    }
}

//实现Runnable接口的线程类(和继承方式相似)
class MyRunnable implements Runnable {
    private String name;
    private JTextField ascription;
    private int cnt = 0;
    private Color textColor;
    private double gap;
    public MyRunnable(String name, JTextField ascription, Color color, double gap) {
        this.name = name;
        this.ascription = ascription;
        this.cnt = 0;
        this.textColor = color;
        this.ascription.setForeground(this.textColor);
        this.gap = gap;
    }
    @Override
    public void run() {
        while(true) {
//       System.out.println("Runnable" + this.name + ":" + this.cnt);
            this.ascription.setText("Runnable" + this.name + ":" + this.cnt);
            try {
                Thread.sleep((int)(this.gap * 1000));
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            this.ascription.paintImmediately(this.ascription.getBounds());
            cnt = (cnt + 1) % 100;
        }
    }
}

--窗体类MyFrame

package com.junlin.exer9;

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.Border;

/**
 * @Description:
 * @author: junlin623
 * @create: 2022-11-20 23:45
 */
public class MyFrame extends JFrame{
    public JLabel title1;
    public JLabel title2;
    public JTextField ttext1;  //左上角文本控件
    public JTextField ttext2;  //右上角文本控件
    public JTextField rtext1; //左下角文本控件
    public JTextField rtext2;  //右下角文本控件
    public MyFrame(String name) {
        super(name);
        Container contentPane = this.getContentPane();
        contentPane.setLayout(null);
        contentPane.setBackground(Color.white);
        JPanel thread_panel = new JPanel(null);
        thread_panel.setBackground(Color.white);
        JPanel runnable_panel = new JPanel(null);
        runnable_panel.setBackground(Color.white);

        ttext1 = new JTextField("Thread A:0");
        ttext1.setBounds(50,60,120,30);
        ttext1.setFont(new Font("黑体", Font.BOLD, 16));
        thread_panel.add(ttext1);
        ttext2 = new JTextField("Thread B:0");
        ttext2.setFont(new Font("黑体", Font.BOLD, 16));
        ttext2.setBounds(300,60,120, 30);
        thread_panel.add(ttext2);
        rtext1 = new JTextField("Runnable A:0");
        rtext1.setFont(new Font("黑体", Font.BOLD, 16));
        rtext1.setBounds(50,60,120, 30);
        runnable_panel.add(rtext1);
        rtext2 = new JTextField("Runnable B:0");
        rtext2.setBounds(300,60,120, 30);
        rtext2.setFont(new Font("黑体", Font.BOLD, 16));
        runnable_panel.add(rtext2);
        //给panel添加一个边框
        Border border1 = BorderFactory.createTitledBorder("Thread方法的2个线程");
        Border border2 = BorderFactory.createTitledBorder("Runnable方法的2个线程");
        thread_panel.setBounds(10,25,550, 250);
        thread_panel.setBorder(border1);
        runnable_panel.setBorder(border2);
        runnable_panel.setBounds(10, 275, 550 ,250);

        contentPane.add(thread_panel);
        contentPane.add(runnable_panel);
        this.setVisible(true);
        this.setSize(new Dimension(600,600));
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}


标签:Java,name,实验,new,import,多线程,ascription,panel,JTextField
From: https://www.cnblogs.com/junlin623/p/17171474.html

相关文章

  • Java实验-Swing 色子游戏
    一、实验要求:、筛子游戏是一个具有趣味性的小游戏,它的实现原理是绘制图形,加载图片,通过鼠标事件点击按钮,晃动色子采用的是定时器,每隔200毫秒切换一次色子的图片实现:请......
  • Java实验-Swing 计算器
    实验要求:计算器软件是非常实用的工具请用Java图形界面的知识,编写以上软件。仅用JButton、JTextField两个组件和JFrame窗口实现。实现基本的加减乘除运算。代码:Gr......
  • Java实验-Swing 扑克牌游戏
    实验要求:扑克牌游戏是非常具有趣味性游戏,如下图所示,建立一个窗口界面,用JLable和相关组件(比如适当增加按钮,文本域等,可以自由发挥)实现以下界面,要求:点击任何一张牌,能控制......
  • Java实验-Swing 涂鸦板
    实验要求:涂鸦板是一个具有趣味性的小程序,它的实现原理是通过鼠标事件,控制鼠标移动结合画图功能实现。鼠标拖拽才开始绘制,松开鼠标则停止绘制。代码:--MyPaint画板类:pac......
  • java调用WCF服务
    一、概述最近项目上有需要和建科机器进行通信的需求,而建科这边给的技术文档和服务都是webservice的,我这边要做的就是用Java和建科的webservice交互。启动建科的webservice......
  • 【JavaScript】33_递归
    17、递归递归调用自身的函数称为递归函数递归的作用和循环是基本一直递归的核心思想就是将一个大的问题拆分为一个一个小的问题,小的问题解决了,大的问题也就解决了编写递归函......
  • mac系统上hdfs java api的简单使用
    1、背景在上一节中,我们简单学习了在命令行上如何操作hdfsshellapi,此处我们通过java程序来操作一下。2、环境准备需要在本地环境变量中配置HADOOP_HOME或在程序启动......
  • mac系统上hdfs java api的简单使用
    目录1、背景2、环境准备3、环境搭建3.1引入jar包3.2引入log4j.properties配置文件3.3初始化HadoopApi4、javaapi操作4.1创建目录4.2上传文件4.3列出目录下有哪些文......
  • Java读取文件的几种方式
    1.使用流读取文件publicstaticvoidstream(){StringfileName="D:\\test.txt";finalStringCHARSET_NAME="UTF-8";List<String>content=new......
  • 【javascript】slice()、substring()和substr() 三种字符串截取方法区别
    slice(start,end):slice(start,end)方法可提取字符串的某个部分,并以新的字符串返回被提取的部分。 1、start(包含)和end(不包含)参数来指定字符串提取的部分;2、......