Board logo

標題: 龜兔賽跑 (一) [打印本頁]

作者: 周政輝    時間: 2018-5-26 10:37     標題: 龜兔賽跑 (一)

本帖最後由 周政輝 於 2018-5-26 11:05 編輯

利用多執行緒,模擬龜兔賽跑。烏龜跑得慢,但持續而不間斷;兔子跑得快,但會不定時的停下休息。同時進行中的兩個執行緒不會互相干擾。參考執行畫面如下:

[attach]4146[/attach]


[attach]4147[/attach]
[attach]4148[/attach]
作者: 蔡季樺    時間: 2018-5-26 11:35

  1. import javax.swing.JLabel;


  2. public class MyThread1 extends Thread{
  3.         JLabel lblNewLabel = null;
  4.         public MyThread1(JLabel lblNewLabel) {
  5.                 this.lblNewLabel = lblNewLabel;
  6.         }

  7.         public void run()
  8.     {
  9.                 int x = lblNewLabel.getLocation().x;
  10.                 int sleep=0;
  11.                 while(true)
  12.                 {
  13.                         x+=20;
  14.                         try {
  15.                                 Thread.sleep(100);
  16.                         } catch (InterruptedException e) {
  17.                                 // TODO 自動產生的 catch 區塊
  18.                                 e.printStackTrace();
  19.                         }
  20.                         lblNewLabel.setLocation(x, 40);
  21.                         sleep=(int)(Math.random()*3000);
  22.                         try {
  23.                                 Thread.sleep(sleep);
  24.                         } catch (InterruptedException e) {
  25.                                 // TODO 自動產生的 catch 區塊
  26.                                 e.printStackTrace();
  27.                         }
  28.                 }
  29.     }
  30. }
複製代碼
  1. import javax.swing.JLabel;


  2. public class MyThread2 extends Thread{
  3.         JLabel lblNewLabel_1 = null;
  4.         public MyThread2(JLabel lblNewLabel_1) {
  5.                 this.lblNewLabel_1 = lblNewLabel_1;
  6.         }

  7.         public void run()
  8.     {
  9.                 int x = lblNewLabel_1.getLocation().x;
  10.                 while(true)
  11.                 {
  12.                         x+=2;
  13.                         try {
  14.                                 Thread.sleep(100);
  15.                         } catch (InterruptedException e) {
  16.                                 // TODO 自動產生的 catch 區塊
  17.                                 e.printStackTrace();
  18.                         }
  19.                         lblNewLabel_1.setLocation(x, 132);
  20.                 }
  21.     }
  22. }
複製代碼
  1. import java.awt.BorderLayout;
  2. import java.awt.EventQueue;

  3. import javax.swing.JFrame;
  4. import javax.swing.JPanel;
  5. import javax.swing.border.EmptyBorder;
  6. import javax.swing.JLabel;
  7. import javax.swing.ImageIcon;


  8. public class main extends JFrame {

  9.         private JPanel contentPane;

  10.         /**
  11.          * Launch the application.
  12.          */
  13.         public static void main(String[] args) {
  14.                 EventQueue.invokeLater(new Runnable() {
  15.                         public void run() {
  16.                                 try {
  17.                                         main frame = new main();
  18.                                         frame.setVisible(true);
  19.                                 } catch (Exception e) {
  20.                                         e.printStackTrace();
  21.                                 }
  22.                         }
  23.                 });
  24.         }

  25.         /**
  26.          * Create the frame.
  27.          */
  28.         public main() {
  29.                 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  30.                 setBounds(100, 100, 450, 300);
  31.                 contentPane = new JPanel();
  32.                 contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
  33.                 setContentPane(contentPane);
  34.                 contentPane.setLayout(null);
  35.                
  36.                 JLabel lblNewLabel = new JLabel("");
  37.                 lblNewLabel.setIcon(new ImageIcon("C:\\Users\\student\\Downloads\\r.gif"));
  38.                 lblNewLabel.setBounds(22, 40, 75, 64);
  39.                 contentPane.add(lblNewLabel);
  40.                 MyThread1 t = new MyThread1(lblNewLabel);
  41.         t.start();
  42.         
  43.                
  44.                 JLabel lblNewLabel_1 = new JLabel("New label");
  45.                 lblNewLabel_1.setIcon(new ImageIcon("C:\\Users\\student\\Downloads\\t.gif"));
  46.                 lblNewLabel_1.setBounds(10, 132, 87, 64);
  47.                 contentPane.add(lblNewLabel_1);
  48.                 MyThread2 t2 = new MyThread2(lblNewLabel_1);
  49.                 t2.start();
  50.                
  51.         }
  52. }
複製代碼

作者: 林侑成    時間: 2018-5-26 11:50

  1. package asdf;
  2. import java.awt.EventQueue;
  3. import javax.swing.JFrame;
  4. import javax.swing.JPanel;
  5. import java.awt.BorderLayout;
  6. import java.awt.FlowLayout;
  7. import java.awt.CardLayout;
  8. import java.awt.Window;
  9. import net.miginfocom.swing.MigLayout;
  10. import javax.swing.ImageIcon;
  11. import javax.swing.JLabel;
  12. import javax.swing.GroupLayout;
  13. import javax.swing.GroupLayout.Alignment;
  14. import javax.swing.border.EmptyBorder;
  15. public class Main {

  16.         private JPanel contentPane;
  17.         protected Object frame;
  18.         /**
  19.          * Launch the application.
  20.          */
  21.         public static void main(String[] args) {
  22.                 EventQueue.invokeLater(new Runnable() {
  23.                         public void run() {
  24.                                 try {
  25.                                         Main window = new Main();
  26.                                         ((Window) window.frame).setVisible(true);
  27.                                 } catch (Exception e) {
  28.                                         e.printStackTrace();
  29.                                 }
  30.                         }
  31.                 });
  32.         }

  33.         /**
  34.          * Create the application.
  35.          */
  36.         public Main() {
  37.                   setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  38.           setBounds(100, 100, 450, 300);
  39.           contentPane = new JPanel();
  40.           contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
  41.           setContentPane(contentPane);
  42.           contentPane.setLayout(null);
  43.          
  44.           JLabel label = new JLabel("");
  45.           label.setIcon(new ImageIcon("C:\\Users\\student\\Downloads\\r.gif"));
  46.           label.setBounds(22, 40, 75, 64);
  47.           contentPane.add(label);
  48.           MyThread1 t = new MyThread1(label);
  49.           t.start();
  50.          
  51.           JLabel label_1 = new JLabel("");
  52.           label_1.setIcon(new ImageIcon("C:\\Users\\student\\Downloads\\r.gif"));
  53.           label_1.setBounds(10, 132, 87, 64);
  54.           contentPane.add(label_1);
  55.           MyThread2 t2 = new MyThread2(label_1);
  56.           t2.start();
  57.         }
  58. }
複製代碼
  1. package asdf;
  2. import javax.swing.JLabel;
  3. public class MyThread1 extends Thread{
  4.         JLabel label = null;
  5.         public MyThread1(JLabel label) {
  6.                 this.label = label;
  7.         }
  8.         public void run()
  9.         {
  10.                 int x = label.getLocation().x;
  11.                 int sleep=0;
  12.                 while(true)
  13.                 {
  14.                         x+=20;
  15.                         try {
  16.                                 Thread.sleep(75);
  17.                         } catch (InterruptedException e) {
  18.                                 // TODO 自動產生的 catch 區塊
  19.                                 e.printStackTrace();
  20.                         }
  21.                         label.setLocation(x, 40);
  22.                         sleep=(int)(Math.random()*3000);
  23.                         try {
  24.                                 Thread.sleep(sleep);
  25.                         } catch (InterruptedException e) {
  26.                                 // TODO 自動產生的 catch 區塊
  27.                                 e.printStackTrace();
  28.                         }
  29.                 }
  30.         }
  31. }
複製代碼
  1. package asdf;
  2. import javax.swing.JLabel;
  3. public class MyThread2 extends Thread{
  4.         JLabel label_1 = null;
  5.         public MyThread2(JLabel label_1) {
  6.                 this.label_1 = label_1;
  7.         }
  8.         public void run()
  9.         {
  10.                 int x = label_1.getLocation().x;
  11.                 while(true)
  12.                 {
  13.                         x+=2;
  14.                         try {
  15.                                 Thread.sleep(100);
  16.                         } catch (InterruptedException e) {
  17.                                 // TODO 自動產生的 catch 區塊
  18.                                 e.printStackTrace();
  19.                         }
  20.                         label_1.setLocation(x, 132);
  21.                 }
  22.         }
  23. }
複製代碼

作者: 黃茂勛    時間: 2018-5-26 11:53

本帖最後由 黃茂勛 於 2018-5-26 11:55 編輯
  1. package bbs.istak.org.tw;

  2. import java.awt.BorderLayout;
  3. import java.awt.EventQueue;

  4. import javax.swing.JFrame;
  5. import javax.swing.JPanel;
  6. import javax.swing.border.EmptyBorder;
  7. import javax.swing.JLabel;
  8. import javax.swing.ImageIcon;

  9. public class haung20180526 extends JFrame {

  10.         private JPanel contentPane;

  11.         /**
  12.          * Launch the application.
  13.          */
  14.         public static void main(String[] args) {
  15.                 EventQueue.invokeLater(new Runnable() {
  16.                         public void run() {
  17.                                 try {
  18.                                         haung20180526 frame = new haung20180526();
  19.                                         frame.setVisible(true);
  20.                                 } catch (Exception e) {
  21.                                         e.printStackTrace();
  22.                                 }
  23.                         }
  24.                 });
  25.         }

  26.         /**
  27.          * Create the frame.
  28.          */
  29.         public haung20180526() {
  30.                 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  31.                 setBounds(100, 100, 704, 381);
  32.                 contentPane = new JPanel();
  33.                 contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
  34.                 setContentPane(contentPane);
  35.                 contentPane.setLayout(null);
  36.                
  37.                 JLabel rabbit = new JLabel("");
  38.                 rabbit.setIcon(new ImageIcon(haung20180526.class.getResource("/bbs/istak/org/tw/r.gif")));
  39.                 rabbit.setBounds(60, 38, 67, 73);
  40.                 contentPane.add(rabbit);
  41.                 int x_r = rabbit.getLocation().x;
  42.                 RunRabbit rb = new RunRabbit(x_r,rabbit);
  43.                 rb.start();
  44.                
  45.                 JLabel turtle = new JLabel("");
  46.                 turtle.setIcon(new ImageIcon(haung20180526.class.getResource("/bbs/istak/org/tw/t.gif")));
  47.                 turtle.setBounds(60, 204, 82, 66);
  48.                 contentPane.add(turtle);
  49.                 int x_t = turtle.getLocation().x;
  50.                 Runturtle rt = new Runturtle(x_t,turtle);
  51.                 rt.start();
  52.         }

  53. }
複製代碼
  1. package bbs.istak.org.tw;

  2. import javax.swing.JLabel;

  3. public class RunRabbit extends Thread{

  4.         int x_r = 0;
  5.         JLabel rabbit = null;
  6.         RunRabbit(int x_r, JLabel rabbit)
  7.         {
  8.                 this.x_r = x_r;
  9.                 this.rabbit = rabbit;
  10.         }
  11.         public void run()
  12.         {
  13.                 while(x_r <= 537)
  14.                 {
  15.                         int r = (int)(Math.random()*10);
  16.                         x_r+=6;
  17.                         if(r==1 || r==5 || r==9)
  18.                                 try {
  19.                                         Thread.sleep(1500);
  20.                                 } catch (InterruptedException e) {}
  21.                         //System.out.println(x_r);
  22.                         try {
  23.                                 Thread.sleep(1000);
  24.                         } catch (InterruptedException e) {}
  25.                         rabbit.setLocation(x_r, 38);
  26.                 }
  27.                
  28.                
  29.         }
  30. }
複製代碼
  1. package bbs.istak.org.tw;

  2. import javax.swing.JLabel;

  3. public class Runturtle extends Thread{

  4.         int x_t = 0;
  5.         JLabel turtle = null;
  6.         Runturtle(int x_t, JLabel turtle)
  7.         {
  8.                 this.x_t = x_t;
  9.                 this.turtle = turtle;
  10.         }
  11.         public void run()
  12.         {
  13.                 while(x_t <= 537)
  14.                 {
  15.                         x_t+=3;       
  16.                     try {
  17.                                 Thread.sleep(1000);
  18.                         } catch (InterruptedException e) {}
  19.                     //System.out.println(x_t);
  20.                     turtle.setLocation(x_t, 204);
  21.                 }
  22.         }
  23. }
複製代碼

作者: 張健勳    時間: 2018-6-1 21:21

  1. package bbs.istak.org.tw;

  2. import java.awt.BorderLayout;
  3. import java.awt.EventQueue;

  4. import javax.swing.JFrame;
  5. import javax.swing.JPanel;
  6. import javax.swing.border.EmptyBorder;
  7. import javax.swing.JLabel;
  8. import javax.swing.ImageIcon;


  9. public class Rabbit_and_Turtle_Run extends JFrame {

  10.         private JPanel contentPane;

  11.         /**
  12.          * Launch the application.
  13.          */
  14.         public static void main(String[] args) {
  15.                 EventQueue.invokeLater(new Runnable() {
  16.                         public void run() {
  17.                                 try {
  18.                                         Rabbit_and_Turtle_Run frame = new Rabbit_and_Turtle_Run();
  19.                                         frame.setVisible(true);
  20.                                 } catch (Exception e) {
  21.                                         e.printStackTrace();
  22.                                 }
  23.                         }
  24.                 });
  25.         }

  26.         /**
  27.          * Create the frame.
  28.          */
  29.         public Rabbit_and_Turtle_Run() {
  30.                 setTitle("\u9F9C\u5154\u8CFD\u8DD1");
  31.                 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  32.                 setBounds(100, 100, 898, 269);
  33.                 contentPane = new JPanel();
  34.                 contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
  35.                 setContentPane(contentPane);
  36.                 contentPane.setLayout(null);
  37.                
  38.                 JLabel lblNewLabel = new JLabel("");
  39.                 lblNewLabel.setIcon(new ImageIcon(Rabbit_and_Turtle_Run.class.getResource("/bbs/istak/org/tw/r.gif")));
  40.                 lblNewLabel.setBounds(22, 40, 75, 64);
  41.                 contentPane.add(lblNewLabel);
  42.                 rabbitTH t = new rabbitTH(lblNewLabel);
  43.         t.start();
  44.         
  45.                
  46.                 JLabel lblNewLabel_1 = new JLabel("New label");
  47.                 lblNewLabel_1.setIcon(new ImageIcon(Rabbit_and_Turtle_Run.class.getResource("/bbs/istak/org/tw/t.gif")));
  48.                 lblNewLabel_1.setBounds(22, 132, 75, 64);
  49.                 contentPane.add(lblNewLabel_1);
  50.                 turtleTH t2 = new turtleTH(lblNewLabel_1);
  51.                
  52.                 JLabel lblNewLabel_2 = new JLabel("New label");
  53.                 lblNewLabel_2.setIcon(new ImageIcon(Rabbit_and_Turtle_Run.class.getResource("/bbs/istak/org/tw/endline.jpg")));
  54.                 lblNewLabel_2.setBounds(738, 85, 92, 158);
  55.                 contentPane.add(lblNewLabel_2);
  56.                
  57.                 JLabel label = new JLabel("New label");
  58.                 label.setIcon(new ImageIcon(Rabbit_and_Turtle_Run.class.getResource("/bbs/istak/org/tw/endline.jpg")));
  59.                 label.setBounds(738, 0, 92, 142);
  60.                 contentPane.add(label);
  61.                
  62.                 JLabel label_1 = new JLabel("New label");
  63.                 label_1.setIcon(new ImageIcon(Rabbit_and_Turtle_Run.class.getResource("/bbs/istak/org/tw/endline.jpg")));
  64.                 label_1.setBounds(738, 10, 92, 208);
  65.                 contentPane.add(label_1);
  66.                 t2.start();
  67.                
  68.         }
  69. }

  70. class rabbitTH extends Thread{
  71.     JLabel lblNewLabel = null;
  72.     public rabbitTH(JLabel lblNewLabel) {
  73.             this.lblNewLabel = lblNewLabel;
  74.     }

  75.     public void run()
  76. {
  77.             int x = lblNewLabel.getLocation().x;
  78.             int sleep=0;
  79.             while(true)
  80.             {
  81.                     x+=20;
  82.                     try {
  83.                             Thread.sleep(100);
  84.                     } catch (InterruptedException e) {
  85.                             // TODO 自動產生的 catch 區塊
  86.                             e.printStackTrace();
  87.                     }
  88.                     lblNewLabel.setLocation(x, 40);
  89.                     sleep=(int)(Math.random()*3000);
  90.                     try {
  91.                             Thread.sleep(sleep);
  92.                     } catch (InterruptedException e) {
  93.                             // TODO 自動產生的 catch 區塊
  94.                             e.printStackTrace();
  95.                     }
  96.             }
  97. }
  98. }

  99. class turtleTH extends Thread{
  100.     JLabel lblNewLabel_1 = null;
  101.     public turtleTH(JLabel lblNewLabel_1) {
  102.             this.lblNewLabel_1 = lblNewLabel_1;
  103.     }

  104.     public void run()
  105. {
  106.             int x = lblNewLabel_1.getLocation().x;
  107.             while(true)
  108.             {
  109.                     x+=2;
  110.                     try {
  111.                             Thread.sleep(100);
  112.                     } catch (InterruptedException e) {
  113.                             // TODO 自動產生的 catch 區塊
  114.                             e.printStackTrace();
  115.                     }
  116.                     lblNewLabel_1.setLocation(x, 132);
  117.             }
  118. }
  119. }
複製代碼

作者: 蔡庭豪    時間: 2018-6-2 10:20

  1. package bbs.istak.org.tw;

  2. import java.awt.BorderLayout;
  3. import java.awt.EventQueue;
  4. import java.util.Random;

  5. import javax.swing.JFrame;
  6. import javax.swing.JPanel;
  7. import javax.swing.border.EmptyBorder;
  8. import javax.swing.JLabel;
  9. import javax.swing.ImageIcon;
  10. import javax.swing.JTextField;

  11. public class RTR extends JFrame {

  12.         private JPanel contentPane;

  13.         /**
  14.          * Launch the application.
  15.          */
  16.         public static void main(String[] args) {
  17.                 EventQueue.invokeLater(new Runnable() {
  18.                         public void run() {
  19.                                 try {
  20.                                         RTR frame = new RTR();
  21.                                         frame.setVisible(true);
  22.                                 } catch (Exception e) {
  23.                                         e.printStackTrace();
  24.                                 }
  25.                         }
  26.                 });
  27.         }

  28.         /**
  29.          * Create the frame.
  30.          */
  31.         public RTR() {
  32.                 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  33.                 setBounds(100, 100, 450, 252);
  34.                 contentPane = new JPanel();
  35.                 contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
  36.                 setContentPane(contentPane);
  37.                 contentPane.setLayout(null);
  38.                
  39.                 JLabel flag = new JLabel("");
  40.                 flag.setIcon(new ImageIcon(RTR.class.getResource("/bbs/istak/org/tw/flag (2).png")));
  41.                 flag.setBounds(374, 180, 24, 24);
  42.                 contentPane.add(flag);
  43.                
  44.                 JLabel rabbit = new JLabel("New label");
  45.                 rabbit.setIcon(new ImageIcon(RTR.class.getResource("/bbs/istak/org/tw/r.gif")));
  46.                 rabbit.setBounds(10, 10, 58, 55);
  47.                 contentPane.add(rabbit);
  48.                
  49.                 Random sleep = new Random();
  50.                
  51.                
  52.                
  53.                
  54.                 JLabel turtle = new JLabel("New label");
  55.                 turtle.setIcon(new ImageIcon(RTR.class.getResource("/bbs/istak/org/tw/t.gif")));
  56.                 turtle.setBounds(10, 88, 82, 46);
  57.                 contentPane.add(turtle);
  58.                
  59.                 JLabel result = new JLabel("going on");
  60.                 result.setBounds(10, 180, 112, 24);
  61.                 contentPane.add(result);
  62.                
  63.                 Thread tr = new Thread(){
  64.                        
  65.                         public void run(){
  66.                                
  67.                                 for(int i = rabbit.getLocation().x ; i <= flag.getLocation().x+flag.getWidth() ; i+=20){
  68.                                        
  69.                                         rabbit.setLocation(i, 10);
  70.                                        
  71.                                         try {
  72.                                                 Thread.sleep((sleep.nextInt(5)+1)*1000);
  73.                                         } catch (InterruptedException e) {
  74.                                                 // TODO 自動產生的 catch 區塊
  75.                                                 e.printStackTrace();
  76.                                         }
  77.                                         if(rabbit.getLocation().x == flag.getLocation().x+flag.getWidth()){
  78.                                                         result.setText("rabbit win");
  79.                                                     break;
  80.                                                 }
  81.                                        
  82.                                 }
  83.                                
  84.                         }
  85.                        
  86.                 };
  87.                
  88.                 Thread tt = new Thread(){
  89.                        
  90.                         public void run(){
  91.                                
  92.                                 for(int i = turtle.getLocation().x ; i <= flag.getLocation().x+flag.getWidth() ; i+=3){
  93.                                      turtle.setLocation(i, 88);
  94.                                                      
  95.                                      
  96.                                      try {
  97.                                                 Thread.sleep(500);
  98.                                         } catch (InterruptedException e) {
  99.                                                 // TODO 自動產生的 catch 區塊
  100.                                                 e.printStackTrace();
  101.                                         }
  102.                                      if(turtle.getLocation().x == flag.getLocation().x+flag.getWidth()){
  103.                                              result.setText("turtle win");
  104.                                              break;
  105.                                      }
  106.                                 }
  107.                         }
  108.                        
  109.                 };
  110.                 tr.start();
  111.                 tt.start();
  112.                
  113.         }
  114. }
複製代碼





歡迎光臨 種子論壇 | 高雄市資訊培育協會學員討論區 (http://istak.org.tw/seed/) Powered by Discuz! 7.2