Experiment 5 Java multi-thread programming

Purpose

  1. Master the method of Runnable interface to realize multithreading
  2. Master the usage of Thread class to realize multi-threading
  3. Master the basic methods of multi-thread programming in Java language

Experimental content

  1. Thread Relay ( 45 points)

Write an application that, in addition to the main thread, has three threads: first, second, and third. First is responsible for simulating the movement of a red button from coordinates (10, 60) to (100, 60); second is responsible for simulating the movement of a green button from coordinates (100, 60) to (200, 60). The third thread is responsible for simulating the movement of a blue button from coordinates (200, 60) to (300, 60).

first step

The following is the tutorial eclipse of idea jdk1.8.

Create a new MoveButton class

 

The second step is to paste the code coverage

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);
	}
}

The third step is to change your student number

 

2. Thread control

Write a program that animates a string in a text field. Add three buttons to the south of the form to add thread control function to the program. It is required to click the start button (startBtn), the thread starts to start, the text is displayed one by one, and the button state is changed to disabled (because the thread cannot be started repeatedly); click to pause Button (pauseBtn), the thread pauses, and the text display stops; click the resume button (resumeBtn), the thread resumes, and the text continues to display. When the thread finishes executing, restore the state of the start button to available.

First step new key RunnableDemo class

 The second step is to paste the code and cover it

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); //创建本类实例对象
    }
}

change name here 

Guess you like

Origin blog.csdn.net/m0_59054762/article/details/130585264