số là hôm nay ông thầy có cho 1 đoạn code "trái banh chạy trên màn hình" bảo về nhà tự đọc tự tìm hiểu và ổng ko giải thích gì thêm cái chính là xem và hiểu cách làm việc của multithread đây là lần đầu em gặp code java, trước đây chưa từng học về cái này nên săn tiện muốn tìm hiểu thêm tí về đoạn code dưới đây em cũng hiểu đc sơ sơ duy chỉ có cái hàm g.dispose() ko hiểu để làm gì pác nào giải thích giúp em, em xin cám ơn & nếu đc thì giải thích nguyên đoạn code giùm em xem cái "sơ sơ" của em hiểu đc có chính xác ko cám ơn máy pác nhiều Mã: import java.awt.*; import javax.swing.*; public class Balls extends Thread{ private JPanel box; private static final int XSIZE=10; private static final int YSIZE=10; private int x=0; private int y=0; private int dx=2; private int dy=2; public Balls(JPanel p){ box=p; } public void draw(){ Graphics g=box.getGraphics(); g.fillOval(x,y,XSIZE,YSIZE); g.dispose(); } public void move(){ Graphics g=box.getGraphics(); g.setXORMode(Color.GREEN); g.fillOval(x,y,XSIZE,YSIZE); x+=dx; y+=dy; Dimension d=box.getSize(); if(x<0){ x=0; dx=-dx; } if(x+XSIZE>=d.getWidth()){ x=d.width-XSIZE; dx=-dx; } if(y<0){ y=0; dy=-dy; } if(y+YSIZE>=d.getHeight()){ y=d.height-YSIZE; dy=-dy; } g.fillOval(x,y,XSIZE,YSIZE); g.dispose(); } public void run(){ draw(); for(int i=0; i<5000; i++){ move(); try{ sleep(10); }catch(InterruptedException ex){ JOptionPane.showMessageDialog(null,ex.toString(),"Thong Bao Loi",JOptionPane.ERROR_MESSAGE); } } } }
Nhầm rồi, bạn để ý là trong vòng lặp for(5000) phương thức move() được gọi 5000 lần, mỗi lần gọi biến tham chiếu g lại được khởi tạo Graphics g=box.getGraphics(), nếu cứ để nó tạo tự do quá nhiều biến thì sẽ dẫn đến tràn bộ nhớ, nếu chỉ trông cậy vào tiến trình dọn rác của Java không thì không đáng tin lắm, thông thường một lập trình viên có kinh nghiệm sẽ giải phóng bộ nhớ thủ công luôn mà không đợi đến lúc trình dọn rác làm việc, phương thức dispose() ở đây chính là để giải phóng bộ nhớ cho biến g. Với máy móc như hiện nay thì dù bạn có bỏ dòng code đó đi thì chạy cũng chẳng thấy có khác biệt gì, nhưng cứ thử bỏ dispose(), bỏ sleep(), tăng vòng lặp lên 1 tỉ xem sao, mình ko thử nhưng đoán là sẽ treo