JAVA Thread

今天看到Android綠豆湯裡在做,多執行緒的練習,想說很久沒有碰java了,所以就跟著他做了一下練習,就是模擬雪下下來的情形,當我們有一個class繼承了Thread,那麼我們override 他的 run 方法 ,就可以用 start 方法去呼叫了,然後他就會自動幫我們排程

主程式

package thereadtest;

import java.awt.Color;
import java.awt.Graphics;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 *
 * @author kwei
 */
public class ThereadTest extends JFrame{

    SnowPanel canvas = new SnowPanel();
    ThereadTest(){
        setSize(850,650);
        setLocation(500, 300);
        add(canvas);

        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setVisible(true);

    }
    public class SnowPanel extends JPanel{
        // 把所有的雪(snow)加到這裡
        ArrayList<Snow> snows = new ArrayList<>();

        public SnowPanel() {
            setBackground(Color.black);
            // 新增所有的雪
            for(int i=0; i<100; i++){
                Snow snow = new Snow(this);
                //丟入執行緒
                snow.start();

                snows.add(snow);
            }
        }

        @Override
        protected void paintComponent(Graphics g){
            super.paintComponent(g);
            for(int i=0; i<100; i++){
                Snow sonw = snows.get(i);
                // 畫出來
                g.setColor(Color.white);
                g.fillOval(sonw.x,sonw.y, 10, 10);
            }
        }

    }
    public static void main(String[] args) {
        new ThereadTest();
    }

}


Snow class

package thereadtest;

import java.util.Random;

/**
 *
 * @author kwei
 */
public class Snow extends Thread{
    int x,y;
    Random random = new Random();
    private ThereadTest.SnowPanel snowPanel;
    Snow(ThereadTest.SnowPanel aThis) {
        // 要在snowPanel上畫畫
        this.snowPanel = aThis;
        x=random.nextInt(850);
        y=random.nextInt(650);
    }
    @Override
    public void run(){
        // 更改雪的位置
        while (true) {
            y++;
            x=x+(random.nextInt(3))-1;
            System.out.println("x"+x);
            // 在snowPanel 上在畫一次 呼叫paintComponent
            snowPanel.repaint();
            // 如果到底部,就從頭開始
            if(y==650) y=0;
            try {
                sleep(1);
            } catch (Exception e) {
                e.getStackTrace();
            }
        }
    }

}

執行結果