Java 简单多线程选号

来源:互联网 发布:做淘宝新手自己做模特 编辑:程序博客网 时间:2024/04/28 05:01

每位数字用一个线程控制其变化,点击“停止”按钮则所有标签数字停止变化。



方式一:不同线程产生不同数字,将数字替换容器中JLable的值


[java] view plain copy
  1. package eight;  
  2.   
  3. import java.awt.BorderLayout;  
  4. import java.awt.event.ActionEvent;  
  5. import java.awt.event.ActionListener;  
  6.   
  7. import javax.swing.JButton;  
  8. import javax.swing.JFrame;  
  9. import javax.swing.JLabel;  
  10. import javax.swing.JPanel;  
  11.   
  12. public class task5 {  
  13.   
  14.     public static void main(String[] args) {  
  15.         new JFrameTest();  
  16.     }  
  17. }  
  18.   
  19. class JFrameTest extends JFrame implements ActionListener {  
  20.   
  21.     private JButton jButton;  
  22.     private JLabel[] jLabels;  
  23.     private JPanel jPanel;  
  24.     private ThreadMain threadMain;  
  25.   
  26.     public JFrameTest() {  
  27.         // 加入基本组件  
  28.         setBounds(150100400400);  
  29.   
  30.         jButton = new JButton("停止");  
  31.         jButton.addActionListener(this);  
  32.         jLabels = new JLabel[5];  
  33.         add(jButton, BorderLayout.NORTH);  
  34.   
  35.         jPanel = new JPanel();  
  36.         for (int i = 0; i < 5; i++) {  
  37.             jLabels[i] = new JLabel();  
  38.             jPanel.add(jLabels[i]);  
  39.         }  
  40.         add(jPanel, BorderLayout.CENTER);  
  41.   
  42.         setVisible(true);  
  43.         setDefaultCloseOperation(DISPOSE_ON_CLOSE);  
  44.   
  45.         // 启动线程  
  46.         threadMain = new ThreadMain(this);  
  47.         threadMain.start();  
  48.   
  49.     }  
  50.   
  51.     @Override  
  52.     public void actionPerformed(ActionEvent e) {  
  53.         threadMain.myStop();  
  54.     }  
  55.   
  56.     public JLabel[] getjLabels() {  
  57.         return jLabels;  
  58.     }  
  59.   
  60.     public void setjLabels(int[] tempNumber) {  
  61.         // 将随机数重新赋值个lable  
  62.         for(int i =0;i < 5; i++) {  
  63.             this.jLabels[i].setText(tempNumber[i] + "");  
  64.         }  
  65.     }  
  66. }  
  67.   
  68. class ThreadMain extends Thread {  
  69.     private ThreadSon[] threadSons;  
  70.     private boolean flag;  
  71.     private JFrameTest jFrameTest;  
  72.   
  73.     public ThreadMain(JFrameTest jFrameTest) {  
  74.         flag = true;  
  75.         this.jFrameTest = jFrameTest;  
  76.         threadSons = new ThreadSon[5];  
  77.         // 启动子线程  
  78.         for (int i = 0; i < 5; i++) {  
  79.             threadSons[i] = new ThreadSon();  
  80.             threadSons[i].start();  
  81.         }  
  82.     }  
  83.   
  84.     public void run() {  
  85.         while (flag) {  
  86.             int[] tempNumber = new int[5];  
  87.             for (int i = 0; i < 5; i++) {  
  88.                 tempNumber[i] = threadSons[i].getNumber();  
  89.             }  
  90.             jFrameTest.setjLabels(tempNumber);  
  91.         }  
  92.     }  
  93.   
  94.     public void myStop() {  
  95.         // 关闭当前线程  
  96.         flag = false;  
  97.         // 关闭子线程  
  98.         for (ThreadSon element : threadSons) {  
  99.             element.setFlag(false);  
  100.         }  
  101.     }  
  102.   
  103. }  
  104.   
  105. class ThreadSon extends Thread {  
  106.     private int number;  
  107.     private boolean flag;  
  108.   
  109.     public ThreadSon() {  
  110.         flag = true;  
  111.     }  
  112. //  产生随随机数线程  
  113.     public void run() {  
  114.         while (flag) {  
  115.             number = (int)(Math.random() * 10);  
  116. //          System.out.print(number);  
  117.         }  
  118.     }  
  119.   
  120.     public int getNumber() {  
  121.         return number;  
  122.     }  
  123.   
  124.     public void setFlag(boolean flag) {  
  125.         this.flag = flag;  
  126.     }  
  127.   
  128. }  

方式二: 让JLable 继承Thread,随后直接对JLable的run()方法中进行操作


[java] view plain copy
  1. package eight;  
  2.   
  3. import java.awt.BorderLayout;  
  4. import java.awt.event.ActionEvent;  
  5. import java.awt.event.ActionListener;  
  6.   
  7. import javax.swing.JButton;  
  8. import javax.swing.JFrame;  
  9. import javax.swing.JLabel;  
  10. import javax.swing.JPanel;  
  11.   
  12. public class task6 {  
  13.     public static void main(String[] args) {  
  14.         new JFrameNumber();  
  15.     }  
  16. }  
  17.   
  18. class JFrameNumber extends JFrame implements ActionListener {  
  19.   
  20.     private JButton jButton;  
  21.     private MyJLbale[] myJLbales;  
  22.     private JPanel jPanel;  
  23.   
  24.     public JFrameNumber() {  
  25.         // 加入基本组件  
  26.         setBounds(150100400400);  
  27.   
  28.         jButton = new JButton("停止");  
  29.         jButton.addActionListener(this);  
  30.         add(jButton, BorderLayout.NORTH);  
  31.   
  32.         jPanel = new JPanel();  
  33.         myJLbales = new MyJLbale[5];  
  34.         for (int i = 0; i < 5; i++) {  
  35.             myJLbales[i] = new MyJLbale();  
  36.             jPanel.add(myJLbales[i]);  
  37.             // 启动线程  
  38.             new Thread(myJLbales[i]).start();  
  39.         }  
  40.         add(jPanel, BorderLayout.CENTER);  
  41.   
  42.         setVisible(true);  
  43.         setDefaultCloseOperation(DISPOSE_ON_CLOSE);  
  44.   
  45.     }  
  46.   
  47.     @Override  
  48.     public void actionPerformed(ActionEvent e) {  
  49.         for (int i = 0; i < 5; i++) {  
  50.             myJLbales[i].setFlag(false);  
  51.         }  
  52.     }  
  53. }  
  54.   
  55. // 线程标签  
  56. class MyJLbale extends JLabel implements Runnable {  
  57.   
  58.     private boolean flag;  
  59.   
  60.     public MyJLbale() {  
  61.         setText("0");  
  62.         flag = true;  
  63.     }  
  64.   
  65.     @Override  
  66.     public void run() {  
  67.         while (flag) {  
  68. //          System.out.println(Thread.currentThread().getName());  
  69. //          System.out.println(getText());  
  70.             setText("" + (int) (Math.random() * 10));  
  71.         }  
  72.     }  
  73.   
  74.     public boolean isFlag() {  
  75.         return flag;  
  76.     }  
  77.   
  78.     public void setFlag(boolean flag) {  
  79.         this.flag = flag;  
  80.     }  
  81.   
  82. }  




原创粉丝点击