実験5 Javaマルチスレッドプログラミング

目的

  1. マルチスレッドを実現するRunnableインターフェースのメソッドをマスターする
  2. マルチスレッドを実現するThreadクラスの使い方をマスターする
  3. Java言語によるマルチスレッドプログラミングの基本的な方法をマスターする

実験内容

  1. スレッドリレー( 45点)

メインスレッドに加えて、1 番目、2 番目、3 番目の 3 つのスレッドを持つアプリケーションを作成します。1 つ目は、赤いボタンの座標 (10, 60) から (100, 60) への動きをシミュレートする役割を果たし、2 つ目は、緑のボタンの座標 (100, 60) から (200, 60) への動きをシミュレートする役割を果たします。3 番目のスレッドは、青いボタンの座標 (200, 60) から (300, 60) への移動をシミュレートします。

最初の一歩

以下は idea jdk1.8 のチュートリアル Eclipse です。

新しい MoveButton クラスを作成する

 

2 番目のステップは、コード カバレッジを貼り付けることです。

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

3番目のステップは学籍番号を変更することです

 

2. スレッド制御

テキストフィールド内の文字列をアニメーション化するプログラムを作成します。プログラムにスレッド制御機能を追加するには、フォームの南に 3 つのボタンを追加します。スタート ボタン (startBtn) をクリックすると、スレッドが開始され、テキストが 1 つずつ表示され、ボタンの状態が変更されます。無効にします (スレッドを繰り返し開始できないため)。一時停止ボタン (pauseBtn) をクリックすると、スレッドが一時停止し、テキストの表示が停止します。再開ボタン (resumeBtn) をクリックすると、スレッドが再開され、テキストが表示され続けます。スレッドの実行が終了したら、開始ボタンの状態を使用可能な状態に戻します。

最初のステップの新しいキー RunnableDemo クラス

 2 番目のステップは、コードを貼り付けてカバーすることです。

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

ここで名前を変更します 

おすすめ

転載: blog.csdn.net/m0_59054762/article/details/130585264