多執行緒的基本實現
接著上邊的內容講,我們要嘗試實現一個能讓多個小球同時執行的介面。
首先要實現的就是介面的實現,這一步就沒有必要講了。你要是不會,可以去參考我前邊的技術文章。
接著new一個BallListener類繼承MouseAdapter類,目的是在滑鼠點選後畫出一個球。
在畫球前,我們先考慮一下要怎麼實現,我們可以將每個小球的運動作為一個執行緒,也就是每點選一次滑鼠,就會產生一個球,同時產生一個新的執行緒。但這種方法會產生很多執行緒,我們有更好的方法。我們可以建立一個陣列佇列,將球存進陣列佇列中,然後只需要一個執行緒來控制陣列佇列就行了。
我們讓BallListerner實現Runnable類介面
ArrayList<Ball> al=new ArrayList<Ball>();
在mouseClicked()方法中,我們要例項化一個ball類,該類的作用是控制小球的運動。
public void mouseClicked(MouseEvent e){ if(g==null) g=(Graphics2D)bg.getGraphics(); x=e.getX(); y=e.getY(); //例項化ball類 Ball ba=new Ball(); //將小球的初始位置傳過去 ba.setY(x,y,g,bg); //將小球新增進陣列佇列 al.add(ba); }
之後就是寫好run()方法了
public void run(){ //要讓小球不斷運動,所以要一直迴圈 while(true){ for(int i=0;i<al.size();i++){ //清除小球運動痕跡 al.get(i).clear(); //畫一個新的小球 al.get(i).draw(); //更新小球的新一組位置 al.get(i).move(); } try { Thread.sleep(20); } catch (InterruptedException e1) { e1.printStackTrace(); } } }
別忘了在介面類中加入
BallListener bl=new BallListener(this);
Thread th=new Thread(bl);
th.start();
現在我們已經完成了兩個類了,只剩下ball類。Ball類需要繼承Thread類,通過前邊的程式碼和思路,其實ball類的內容大致出來了。在ball類中,我們要設定球的顏色、球的大小、球的運動方向,
球的運動速度,而這些都是通過隨機數來實現。除此之外,我們還要寫好clear()、draw()、move()方法,在這些方法中,自然是要用上前邊的隨機數。思路基本就是加減那些隨機數,從而來實現不同球的運動。
在clear()方法中,我們會用到
color=bg.getContentPane().getBackground();
這行程式碼,這表示獲取背景色,其實,想要掩蓋已有的小球運動路徑,方法就是用背景色畫球,當然座標要稍微處理一下。
一個能讓多個小球同時執行的介面差不多就實現了。
最後,我提供了原始碼和程式,可以自行下載。
我下篇文章會講小球運動的升級版,我們要實現的是自動產生小球,並且新增一張會動的背景圖。屆時將有三個執行緒(包括主執行緒),因此我還會講到執行緒安全,並且為了介面順暢,會用到雙快取和次畫布的知識。