java
主页 > 软件编程 > java >

Java多线程解决龟兔赛跑问题介绍

2022-08-24 | 佚名 | 点击:

多线程4(龟兔赛跑-休眠线程)

1.题目

在龟兔赛跑中,领先的兔子因为通宵写博客,中途太累睡着了,跑输了乌龟。这个故事说明了兔子是爱学习的同学。咳咳,通宵是不可取的,大家别学。

实现:使用线程休眠模拟龟兔赛跑比赛

2.解题思路

创建一个类:RaceFrame,继承了JFrame。用来界面显示两个文本区域,用来输出乌龟和兔子的比赛记录,比赛开始按钮用来开始比赛。

编写内部类:Rabbit,该类实现了Runnable接口,在run()方法中,让兔子休眠了时间。

Thread是程序中的执行线程。JAVA虚拟机允许应用程序并发地运行多个执行线程。

sleep()方法是Thread类的一个静态方法。

3.代码详解

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

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>

 * 修改记录:

 * 修改后版本            修改人     修改日期            修改内容

 * 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("休眠当前线程");

        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("乌龟的比赛记录");

        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++) {// 循环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");// 当跑了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 + "乌龟到达终点\n");

                }

            }

 

        }

 

    }

}

原文链接:https://juejin.cn/post/7134994456909971464
相关文章
最新更新