Java多線程解決龜兔賽跑問題詳解
多線程4(龜兔賽跑-休眠線程)
1.題目
在龜兔賽跑中,領(lǐng)先的兔子因為通宵寫博客,中途太累睡著了,跑輸了烏龜。這個故事說明了兔子是愛學(xué)習(xí)的同學(xué)??瓤龋ㄏ遣豢扇〉?,大家別學(xué)。
實現(xiàn):使用線程休眠模擬龜兔賽跑比賽
2.解題思路
創(chuàng)建一個類:RaceFrame,繼承了JFrame。用來界面顯示兩個文本區(qū)域,用來輸出烏龜和兔子的比賽記錄,比賽開始按鈕用來開始比賽。
編寫內(nèi)部類:Rabbit,該類實現(xiàn)了Runnable接口,在run()方法中,讓兔子休眠了時間。
Thread是程序中的執(zhí)行線程。JAVA虛擬機允許應(yīng)用程序并發(fā)地運行多個執(zhí)行線程。
sleep()方法是Thread類的一個靜態(tài)方法。
3.代碼詳解
package com.xiaoxuzhu;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.GridLayout;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingConstants;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.UIManager;
import java.awt.Font;
/**
* Description:
*
* @author xiaoxuzhu
* @version 1.0
*
* <pre>
* 修改記錄:
* 修改后版本 修改人 修改日期 修改內(nèi)容
* 2022/5/11.1 xiaoxuzhu 2022/5/11 Create
* </pre>
* @date 2022/5/11
*/
public class RaceFrame extends JFrame {
/**
*
*/
private static final long serialVersionUID = 4941729012450153307L;
private JPanel contentPane;
private JTextArea rabbitTextArea;
private JTextArea tortoiseTextArea;
/**
* Launch the application.
*/
public static void main(String[] args) {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (Throwable e) {
e.printStackTrace();
}
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
RaceFrame frame = new RaceFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public RaceFrame() {
setTitle("休眠當(dāng)前線程");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(new BorderLayout(0, 0));
JPanel buttonPanel = new JPanel();
contentPane.add(buttonPanel, BorderLayout.SOUTH);
JButton button = new JButton("比賽開始");
button.setFont(new Font("微軟雅黑", Font.PLAIN, 16));
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
do_button_actionPerformed(arg0);
}
});
buttonPanel.add(button);
JPanel panel = new JPanel();
contentPane.add(panel, BorderLayout.CENTER);
panel.setLayout(new GridLayout(1, 2, 5, 5));
JPanel rabbitPanel = new JPanel();
panel.add(rabbitPanel);
rabbitPanel.setLayout(new BorderLayout(0, 0));
JLabel rabbitLabel = new JLabel("兔子的比賽記錄");
rabbitLabel.setFont(new Font("微軟雅黑", Font.PLAIN, 16));
rabbitLabel.setHorizontalAlignment(SwingConstants.CENTER);
rabbitPanel.add(rabbitLabel, BorderLayout.NORTH);
JScrollPane rabbitScrollPane = new JScrollPane();
rabbitPanel.add(rabbitScrollPane, BorderLayout.CENTER);
rabbitTextArea = new JTextArea();
rabbitTextArea.setFont(new Font("微軟雅黑", Font.PLAIN, 16));
rabbitScrollPane.setViewportView(rabbitTextArea);
JPanel tortoisePanel = new JPanel();
panel.add(tortoisePanel);
tortoisePanel.setLayout(new BorderLayout(0, 0));
JLabel tortoiseLabel = new JLabel("烏龜?shù)谋荣愑涗?);
tortoiseLabel.setFont(new Font("微軟雅黑", Font.PLAIN, 16));
tortoiseLabel.setHorizontalAlignment(SwingConstants.CENTER);
tortoisePanel.add(tortoiseLabel, BorderLayout.NORTH);
JScrollPane tortoiseScrollPane = new JScrollPane();
tortoisePanel.add(tortoiseScrollPane, BorderLayout.CENTER);
tortoiseTextArea = new JTextArea();
tortoiseTextArea.setFont(new Font("微軟雅黑", Font.PLAIN, 16));
tortoiseScrollPane.setViewportView(tortoiseTextArea);
}
protected void do_button_actionPerformed(ActionEvent arg0) {
Runnable run1 = new Rabbit();
Runnable run2 = new Tortoise();
Thread rabbit = new Thread(run1);
Thread tortoise = new Thread(run2);
rabbit.start();
tortoise.start();
}
private class Rabbit implements Runnable {
@Override
public void run() {
for (int i = 1; i < 11; i++) {// 循環(huán)10次模擬賽跑的過程
String text = rabbitTextArea.getText();// 獲得文本域中的信息
try {
Thread.sleep(1);// 線程休眠0.001秒,模擬兔子在跑步
} catch (InterruptedException e) {
e.printStackTrace();
}
rabbitTextArea.setText(text + "兔子跑了" + i + "0米\n");// 顯示兔子的跑步距離
if (i == 9) {
rabbitTextArea.setText(text + "兔子在睡覺\n");// 當(dāng)跑了90米時開始睡覺
try {
Thread.sleep(10000);// 線程休眠10秒,模擬兔子在睡覺
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (i == 10) {
try {
Thread.sleep(1);// 線程休眠0.001秒,模擬兔子在跑步
} catch (InterruptedException e) {
e.printStackTrace();
}
rabbitTextArea.setText(text + "兔子到達終點\n");// 顯示兔子到達了終點
}
}
}
}
private class Tortoise implements Runnable {
@Override
public void run() {
for (int i = 1; i < 11; i++) {
String text = tortoiseTextArea.getText();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
tortoiseTextArea.setText(text + "烏龜跑了" + i + "0米\n");
if (i == 10) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
tortoiseTextArea.setText(text + "烏龜?shù)竭_終點\n");
}
}
}
}
}

到此這篇關(guān)于Java多線程解決龜兔賽跑問題詳解的文章就介紹到這了,更多相關(guān)Java多線程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot之Validation參數(shù)校驗詳細解讀
這篇文章主要介紹了springboot之Validation參數(shù)校驗詳細解讀,本篇是關(guān)于springboot的參數(shù)校驗知識,當(dāng)然也適用其它java應(yīng)用,讀完本篇將學(xué)會基本的參數(shù)校驗,自定義參數(shù)校驗和分組參數(shù)校驗,需要的朋友可以參考下2023-10-10
springboot打包無法讀取yml、properties等配置文件的解決
這篇文章主要介紹了springboot打包無法讀取yml、properties等配置文件的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04
淺談java并發(fā)之計數(shù)器CountDownLatch
CountDownLatch是通過一個計數(shù)器來實現(xiàn)的,當(dāng)我們在new 一個CountDownLatch對象的時候需要帶入該計數(shù)器值,該值就表示了線程的數(shù)量。下面我們來深入了解一下吧2019-06-06

