在龟兔赛跑中,领先的兔子因为通宵写博客,中途太累睡着了,跑输了乌龟。这个故事说明了兔子是爱学习的同学。咳咳,通宵是不可取的,大家别学。
实现:使用线程休眠模拟龟兔赛跑比赛
创建一个类:RaceFrame,继承了JFrame。用来界面显示两个文本区域,用来输出乌龟和兔子的比赛记录,比赛开始按钮用来开始比赛。
编写内部类:Rabbit,该类实现了Runnable接口,在run()方法中,让兔子休眠了时间。
Thread是程序中的执行线程。JAVA虚拟机允许应用程序并发地运行多个执行线程。
sleep()方法是Thread类的一个静态方法。
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"); } }
}
} } |