Giáo trình bài giảng môn học: Lập trình Java
Thuộc tính
Tính chất mô tả một đối tượng
Hành động
Dịch vụ mà đối tượng có thể đáp ứng
Phương thức
Đặc tả cách đáp ứng bằng hành động khi được yêu cầu
Thông điệp
Yêu cầu một hành động
Biến cố
Sự kích thích từ đối tượng này gởi sang đối tượng khác
rmatException e){ messageDisplay.setText("Illegal coordinate "); } } }// Định nghĩa lớp DrawRegion mở rộng lớp Canvas và sử dụng các hàng ở giao diệnclass DrawRegion extends Canvas implements IGeometryConstants{ private int shape,xCoord, yCoord; private boolean fillFlag; private int width; public DrawRegion(){ setSize(150, 150); setBackground(Color.white); }// Định nghĩa hàm doDraw() để vẽ public void doDraw(int h, int x, int y, boolean f, int w){ this.shape = h; this.xCoord = x; this.yCoord = y; this.fillFlag = f; this.width = w; repaint(); } public void paint(Graphics g){ switch(shape){ case SQUARE: if(fillFlag) g.fillRect(xCoord, yCoord, width,width); else g.drawRect(xCoord, yCoord, width,width); break; case CIRCLE: if(fillFlag) g.fillOval(xCoord, yCoord, width,width); else g.drawOval(xCoord, yCoord, width,width); break; case ELLIPSE: if(fillFlag) g.fillOval(xCoord,yCoord,width,width/2); else g.drawOval(xCoord, yCoord, width,width/2); break; } } }MenusCác loại menu :Pull-downPop-up menu Chỉ có thể đặt các thanh menubar vào trong các Frame mà thôiCác thành phần của menu:MenubarMenuItemsThành phần Menu Lớp abstract class MenuComponent là lớp cơ sở cho tất cả các lớp thực hiện những vấn đề liên quan đến thực đơn (menu).Lớp MenuBar cài đặt thanh thực đơn và trong đó có thể chứa các thực đơn pull-down.Lớp MenuItem định nghĩa từng mục của thực đơn.Lớp Menu cài đặt các thực đơn pull-down để có thể đưa vào một thực đơn bất kỳ.Lớp PopUpMenu biểu diễn cho thực đơn pop-up .Lớp CheckboxMenuItem chứa các mục được chọn để kiểm tra trong các mục.Việc tạo lập một thanh thực đơn cho một frame được thực hiện như sau:1. Tạo ra một thanh thực đơn, MenuBar thanhThDon = new MenuBar();2. Tạo ra một thực đơn, Menu thucDon = new Menu(“Cac loai banh”);3. Tạo ra các mục trong thực đơn và đưa vào thực đơn, MenuItem muc = new MenuItem(“Banh day”); thucDon.add(muc); // Đưa muc vào thucDon4. Đưa các thực đơn vào thanh thực đơn, thanhThDon.add(thucDon); // Đưa thucDon vào thanhThDon5. Tạo ra một frame và đưa thanh thực đơn vào frame đó. Frame frame = new Frame(“Cac mon an”); frame.add(thanhThDon); // Đưa thanhThDon vào frame190Thành phần MenuVí dụ: Tạo lập và sử dụng các thực đơn.import java.awt.*;import java.applet.*;public class MenuDemo extends Applet{ public static void main(String args[]){ MenuBar thanhThDon = new MenuBar(); Menu thucDon = new Menu("Cac loai banh"); MenuItem b1 = new MenuItem("Banh day"); thucDon.add(b1); MenuItem b3 = new MenuItem("Banh khoai"); thucDon.add(b3); thucDon.addSeparator();// Tạo ra một thanh phân cách MenuItem b4 = new MenuItem("Banh gio"); thucDon.add(b4); thucDon.add(new CheckboxMenuItem("Banh ran")); thanhThDon.add(thucDon); Frame frame = new Frame("Cac mon an"); frame.setMenuBar(thanhThDon); frame.pack(); frame.setVisible(true);} }Chương VIAppletsApplets Là một chương trình Java mà chạy với sự hỗ trợ của trình duyệt web hoặc appletviewerTất cả các applets là lớp con của lớp ‘Applet’Để tạo một applet, bạn cần import gói sau:java.appletCấu trúc appletĐịnh nghĩa một applet từ bốn sự kiện xảy ra trong quá trình thực thiĐối với mỗi sự kiện được định nghĩa bởi một phương thức tương ứng.Các phương thức:init( ) start( ) stop( ) destroy( ) Các phương thức khác:paint( ) repaint( )showStatus( ) getAppletInfo( ) Các phương thức init(), start(), stop(), destroy(), and paint() được thừa kế từ applet.Mỗi phương thức này mặc định là rỗng. Vì thế các phương thức này phải được nạp chồng. Biên dịch và thực thi appletMột applet thì được biên dịch theo cú pháp sau javac Applet1.javaĐể thực thi một applet, tạo một tập tin HTML có sử dụng thẻ appletThẻ applet có hai thuộc tính:WidthHeightĐể truyền tham số tới applet, sử dụng thẻ ‘param’, và tiếp theo là thẻ ‘value’Applet có thể được thực thi bằng applet viewer Điểm khác biệt giữa applet và một ứng dụngCác ứng dụng khi thực thi phải sử dụng trình biên dịch Java, trong khi các applets thực thi được trên bất kỳ trình duyệt nào mà hỗ trợ Java, hoặc sử dụng ‘AppletViewer’ trong JDK.Một ứng dụng bắt đầu với phương thức ‘main()’. Còn đối với applet thì không sử dụng phương thức nàyMột ứng dụng sử dụng ‘System.out.println()’ để hiển thị, trong khi môt applet thì sử dụng các phương thức của lớp Graphics.Những hạn chế về bảo mật trong appletKhông thể đọc hoặc viết các tập tin trên hệ thống tập tin của người sử dụngKhông thể giao tiếp với một site trên internet. Mà chỉ giao tiếp với một dịch vụ trên trang web có applet.Không thể chạy bất kỳ chương trình nào trên hệ thống của người đọcKhông thể load bất kỳ chương trình nào được lưu trên hệ thống của người sử dụngChu trình sống của appletTruyền tham số tới một appletĐể truyền tham số, sử dụng PARAM trong thẻ HTMLVí dụ Lớp đồ họaĐược cung cấp bởi gói AWTCung cấp một tập hợp các phương thức để vẽ như sau:Oval RectangleSquareCircle LinesText in different fontsGraphical BackgroundCác phương thức để vẽ nền : getGraphics( ) repaint( )update(Graphics g)paint(Graphics g)Hiển thị chuỗi, ký tự và bytes Phương thức để vẽ hoặc hiển thị một chuỗi trên frameCú phápdrawString(String str, int xCoor, int yCoor);Phương thức để vẽ hoặc hiển thị các ký tự trên frame Cú phápdrawChars(char array[ ], int offset, int length, int xCoor, int yCoor); Phương thức để vẽ hoặc hiển thị bytes trên frame Cú phápdrawBytes(byte array[ ], int offset, int length, int xCoor, int yCoor);Vẽ các hình thểPhương thức được sử dụng để vẽ đường thẳng như sauCú phápdrawLine(int x1, int y1, int x2, int y2);Các phương thức được sử dụng để vẽ đường tròn như sauCú phápdrawOval(int xCoor, int yCoor, int width, int height);setColor(Color c);fillOval(int xCoor, int yCoor, int width, int height);Phương thức sử dụng để vẽ hình vuông:Cú phápdrawRect(int xCoor, int yCoor, int width, int height);fillRect(int xCoor, int yCoor, int width, int height);Các phương thức được sử dụng để vẽ hình vuông có góc tròn Cú phápdrawRoundRect(int xCoor, int yCoor, int width, int height, int arcWidth, int arcHeight);fillRoundRect (int xCoor, int yCoor, int width, int height, int arcWidth, int arcHeight); 3D Rectangles & ArcsCác phương thức được sử dụng để vẽ hình 3D Cú pháp draw3DRect(int xCoord, int yCoord, int width, int height, boolean raised);drawArc(int xCoord, int yCoord, int width, int height, int arcwidth, int archeight);fillArc(int xCoord, int yCoord, int width, int height, int arcwidth, int archeight);Drawing PolyLines Các phương thức được sử dụng để vẽ nhiều đoạn thẳngCú phápdrawPolyline(int xArray[ ], int yArray[ ], int totalPoints);g.setFont(new Font("Times Roman", Font.BOLD,15));Vẽ và tô các hình đa giácCác phương thức để vẽ và tô các hình đa giácCú phápdrawPolygon(int x[ ], int y[ ], int numPoints);fillPolygon(int x[ ], int y[ ], int numPoints);MàuJava sử dụng màu RGBBảng các giá trị màuElementRangeRed0-255Green0-255Blue0-255Cú pháp của hàm dựng để tạo một màu color(int red, int green, int blue);Bảng trình bày các giá trị màu RGB thông thườngColorRedGreenBlueWhite255255255Light Gray192192192Gray128128128Dark Gray646464Black000Pink255175175Orange2552000Yellow2552550Magenta2550255FontGói java.awt package cung cấp bởi lớp ‘Font’ Các phương thức của lớp Font:getAllFont( ) getLocalGraphicsEnvironment( ) getFont( )getFontList( ) Hàm dựng Font nhận 3 tham sốTên font trong chuỗi định dạng; tên này có trong phương thức getFontList( ).Kiểu của font. Ví dụ : Font.BOLD, Font.PLAIN, Font.ITALICKích thước của font.Ví dụFont f1 = new Font("SansSerif", Font.ITALIC, 16);g.setFont(f1);Lớp FontMetricsĐo các ký tự khác nhau hiển thị trong các font khác nhau.Việc đo bao gồm ‘height’, ‘baseline’, ‘ascent’, ‘descent’ và ‘leading’ của font.Nó không cụ thể vì nó là một lớp trừu tượngLớp FontMetrics (tiếp theo)Phương thức:getFontMetrics(f1) getHeight( ) getAscent( ) getDescent( ) getLeading( ) getName( ) Kiểu vẽCó 2 kiểu vẽ.XORsetXORMode(Color c) PaintsetPaintMode( )Chương VIILập trình đa tuyếnĐa nhiệm, tiến trình và luồngXử lý đa luồng trong JavaMức ưu tiên của luồng, Vấn đề đồng bộ hoá và bài toán tắc nghẽn Lập trình đa luồng Đa tuyến Là khả năng làm việc với nhiều tuyến Đa tuyến chuyên sử dụng cho việc thực thi nhiều công việc đồng thờiĐa tuyến giảm thời gian rỗi của hệ thống đến mức thấp nhất.Tiến trình, đa nhiệm và đa luồngĐa nhiệm: ở cùng một thời điểm có nhiều hơn một chương trình thực hiện đồng thời trên cùng một máy tính. Có hai kỹ thuật đa nhiệm: + Đa nhiệm dựa trên các tiến trình + Đa nhiệm dựa trên các luồngMỗi tác vụ được thực hiện theo một tiến trình, được xem như một chương trình đơn. Một tiến trình có thể bao gồm nhiều luồng. Các tiến trình có các tập riêng các biến dữ liệu. Các luồng của một tiến trình có thể chia sẻ với nhau về không gian địa chỉ chương trình, các đoạn dữ liệu và môi trường xử lý, đồng thời cũng có vùng dữ liệu riêng để thao tác. Trong môi trường đơn luồng, ở mỗi thời điểm chỉ cho phép một tác vụ thực thi. Kỹ thuật đa nhiệm cho phép tận dụng được những thời gian rỗi của CPU để thực hiện những tác vụ khác. Kỹ thuật đa nhiệm dựa trên các luồng có một số ưu điểm hơn dựa trên các tiến trình: + Các luồng có thể chia sẻ cùng một không gian địa chỉ + Việc dịch chuyển ngữ cảnh thực hiện giữa các luồng yêu cầu chi phí rẻ hơn + Sự truyền thông giữa các luồng thường yêu cầu chi phí rẻ hơn.Đa nhiệm có thể thực hiện được theo hai cách: + Phụ thuộc vào hệ điều hành, nó có thể cho tạm ngừng chương trình mà không cần tham khảo các chương trình đó. + Các chương trình chỉ bị dừng lại khi chúng tự nguyên nhường điều khiển cho chương trình khác.Nhiều hệ điều hành hiện nay đã hỗ trợ đa luồng như: SUN Solaris, Window NT, Window 95, OS/2, v.v. Java hỗ trợ đa nhiệm dựa trên các luồng và cung cấp các đặc tính ở mức cao cho lập trình đa luồng. Tạo lập luồngJava cung cấp hai giải pháp tạo lập luồng: 1. Thiết lập lớp con của Thread 2. Cài đặt lớp xử lý luồng từ giao diện Runnable.(i) Cách thứ nhất: Trong Java có một lớp được xây dựng sẵn là Thread, lớp cơ sở để xây dựng những lớp kết thừa mới để tạo các luồng. class MyClass extends Thread{ // Một số thuộc tính public void run(){ // Các lệnh cần thực hiện theo luồng } // Một số hàm khác được viết đè hay được bổ sung} Khi chương trình chạy nó sẽ gọi một hàm đặc biệt đã được khai báo trong Thread đó là start() để bắt đầu một luồng đã được tạo ra. Tạo lập luồng(ii) Cách thứ hai: Java giải quyết hạn chế trên bằng cách xây dựng lớp để tạo ra các luồng thực hiện trên cơ sở cài đặt giao diện hỗ trợ luồng. Giao diện hỗ trợ thực hiện theo luồng là Runnable. Người lập trình thiết kế các lớp thực hiện theo luồng bằng cách cài đặt theo giao diện Runnable.class MyClass implements Runnable{ // Các thuộc tính // Nạp chồng hay viết đè một số hàm // Viết đè hàm run() . . .} Các trạng thái của ThreadMột luồng có thể ở một trong các trạng thái sau: + New: Khi một luồng mới được tạo ra với toán tử new() và sẵn sàng hoạt động. + Runnable: Trạng thái mà luồng đang chiếm CPU để thực hiện, khi bắt đầu thì nó gọi hàm start(). Bộ lập lịch phân luồng của hệ điều hành sẽ quyết định luồng nào sẽ được chuyển về trạng thái Runnable và hoạt động. Cũng cần lưu ý rằng ở một thời điểm, một luồng ở trạng thái Runnable có thể hoặc không thể thực hiện. + Non runnable (blocked): Từ trạng thái runnable chuyển sang trạng thái ngừng thực hiện (“bị chặn”) khi gọi một trong các hàm: sleep(), suspend(), wait(), hay bị chặn lại ở Input/output. Trong trạng thái bị chặn có ba trạng thái con: + Waiting: khi ở trạng thái Runnable, một luồng thực hiện hàm wait() thì nó sẽ chuyển sang trạng thái chờ đợi (Waiting). + Sleeping: khi ở trạng thái Runnable, một luồng thực hiện hàm sleep() thì nó sẽ chuyển sang trạng thái ngủ (Sleeping). + Blocked: khi ở trạng thái Runnable, một luồng bị chặn lại bởi những yêu cầu về tài nguyên, như yêu cầu vào/ra (I/O), thì nó sẽ chuyển sang trạng bị chặn (Blocked). Các trạng thái của Thread Mỗi luồng phải thoát ra khỏi trạng thái Blocked để quay về trạng thái Runnable, khi o Nếu một luồng đã được cho đi “ngủ” (sleep) sau khoảng thời gian bằng số micro giây n đã được truyền vào tham số của hàm sleep(n). o Nếu một luồng bị chặn lại vì vào/ra và quá trình này đã kết thúc. o Nếu luồng bị chặn lại khi gọi hàm wait(), sau đó được thông báo tiếp tục bằng cách gọi hàm notify() hoặc notifyAll(). o Nếu một luồng bị chặn lại để chờ monitor của đối tượng đang bị chiếm giữ bởi luồng khác, khi monitor đó được giải phóng thì luồng bị chặn này có thể tiếp tục thực hiện (khái niệm monitor được đề cập ở phần sau). o Nếu một luồng bị chặn lại bởi lời gọi hàm suspend(), muốn thực hiện thì trước đó phải gọi hàm resume(). Nếu ta gọi các hàm không phù hợp đối với các luồng thì JVM sẽ phát sinh ra ngoại lệ IllegalThreadStateException. Dead: Luồng chuyển sang trạng thái “chết” khi nó kết thúc hoạt động bình thường, hoặc gặp phải ngoại lệ không thực hiện tiếp được. Trong trường hợp đặc biệt, bạn có thể gọi hàm stop() để kết thúc (“giết chết”) một luồng. yieldNon runnableWaitingSleepingBlocked stopBị chặn bởi I/OresumesuspendsleepstartDeadNewRunnablenotifywaitKết thúc I/O Các mức ưu tiên của các luồngTrong Java, mỗi luồng có một mức ưu tiên thực hiện nhất định.Khi chương trình chính thực hiện sẽ tạo ra luồng chính, luồng cha. Luồng này sẽ tạo ra các luồng con, và cứ thế tiếp tục. Theo mặc định, một luồng sẽ kế thừa mức ưu tiên của luồng cha của nó. Bạn có thể tăng hay giảm mức ưu tiên của luồng bằng cách sử dụng hàm setPriority(). Mức ưu tiên của các luồng có thể đặt lại trong khoảng từ MIN_PRIORITY (Trong lớp Thread được mặc định bằng 1) và MAX_PRIORITY (mặc định bằng 10), hoặc NORM_PRIORITY (mặc định là 5). Luồng có mức ưu tiên cao nhất tiếp tục thực hiện cho đến khi:+ Nó nhường quyền điều khiển cho luồng khác bằng cách gọi hàm yield() + Nó dừng thực hiện (bị “dead” hoặc chuyển sang trạng thái bị chặn). Có một luồng với mức ưu tiên cao hơn vào trạng thái Runnable.Các mức ưu tiên của các luồngVấn đề nảy sinh là chọn luồng nào để thực hiện khi có nhiều hơn một luồng sẵn sàng thực hiện và có cùng một mức ưu tiên cao nhất? Nói chung, một số cơ sở sử dụng bộ lập lịch lựa chọn ngẫu nhiên, hoặc lựa chọn chúng để thực hiện theo thứ tự xuất hiện.Ví dụ: Chúng ta hãy xét chương trình hiển thị các quả bóng màu xanh hoặc đỏ nảy (chuyền) theo những đường nhất định. Mỗi khi nhấn nút “Blue ball” thì có 5 luồng được tạo ra với mức ưu tiên thông thường (mức 5) để hiển thị và di chuyển các quả bóng xanh. Khi nhấn nút “Red ball” thì cũng có 5 luồng được tạo ra với mức ưu tiên (mức 7) cao hơn mức thông thường để hiển thị và di chuyển các quả bóng đỏ. Để kết thúc trò chơi bạn nhấn nút “Close”.Các mức ưu tiên của các luồng import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Bounce{ public static void main(String arg[]){ JFrame fr = new BounceFrame(); fr.show(); }}class BounceFrame extends JFrame{ public BounceFrame(){ setSize(300, 200); setTitle("Bong chuyen"); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); Các mức ưu tiên của các luồng Container contentPane = getContentPane(); canvas = new JPanel(); contentPane.add(canvas, "Center"); JPanel p = new JPanel(); addButton(p, "Blue ball", new ActionListener(){ public void actionPerformed(ActionEvent evt){ for(int i = 0; i = d.width){ x = d.width - XSIZE; dx = -dx; } if(y = d.height){ y = d.height - YSIZE; dy = -dy; } g.fillOval(x, y, XSIZE, YSIZE); g.dispose(); } public void run(){ try{ for(int i = 1; i <= 1000; i++){ move(); sleep(5); } }catch(InterruptedException e){ } } 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; private Color color;} Các mức ưu tiên của các luồng (TT)Chạy chương trình trên chúng ta nhận thấy hình như những quả bóng đỏ nảy nhanh hơn vì các luồng thực hiện chúng có mức ưu tiên cao hơn.Lưu ý: Các luồng có mức ưu tiên thấp hơn sẽ không có cơ hội thực hiện nếu những luồng cao hơn không nhường, hoặc nhường bằng hàm yield(). Nếu có những luồng đang ở trạng thái Runnable mà có mức ưu tiên ít nhất bằng mức ưu tiên của luồng vừa nhường thì một trong số chúng được xếp lịch để thực hiện. + Bộ lập lịch thường xuyên tính lại mức ưu tiên của các luồng đang thực hiện + Tìm luồng có mức ưu tiên cao nhất để thực hiện. Tạo và quản lý tuyến (1) Khi chương trình Java thực thi hàm main() tức là tuyến main được thực thi. Tuyến này được tạo ra một cách tự động, tại đây : - Các tuyến con sẽ được tạo ra từ đó - Nó là tuyến cuối cùng kết thúc việc thực thi. Ngay khi tuyến main ngừng thực thi, chương trình bị chấm dứt Tuyến có thể được tạo ra bằng 2 cách:Dẫn xuất từ lớp ThreadDẫn xuất từ Runnable. Trạng thái của tuyến và các phương thức của lớp Thread trạng thái:bornready to runrunningsleepingwaitingreadyblockeddeadPhương thức:start( ) sleep( ) wait( ) notify( ) run( ) stop( ) Các phương thức Khácenumerate(Thread t)getName( ) isAlive( ) getPriority( ) setName(String name) join( ) isDaemon( ) setDaemon(Boolean on)resume( )sleep( )start( )Phân chia thời gian giữa các tuyếnCPU thực thi chỉ một tuyến tại một thời điểm nhất định.Các tuyến có độ ưu tiên bằng nhau thì được phân chia thời gian sử dụng bộ vi xử lý.Tuyến Daemon(ngầm)Hai kiểu tuyến trong một chương trình Java:Các tuyến người sử dụng tuyến ngầm tuyến ngầm dọn rácĐa tuyến với Applets Các chương trình Java dựa trên Applet thường sử dụng nhiều hơn một tuyếnTrong đa tuyến với Applets, Lớp ‘java.applet.Applet’ là lớp con được tạo ra một Applet người sử dụng đã định nghĩaLớp con của Applet không thể dẫn xuất được trực tiếp từ lớp Thread.Cách để lớp con Applet là tuyến:implements RunnableTruyền đối tương Runnable vào hàm constructor của Thread.Sự đồng bộThâm nhập các tài nguyên/dữ liệu bởi nhiều tuyếnSự đồng bộ (Synchronization)Sự quan sát (Monitor)Mã đồng bộ Để thâm nhập sự quan sát của một đối tượng, lập trình viên sử dụng từ khóa ‘synchronized’ khi khai báo phương thức.Khi một tuyến đang được thực thi trong phạm vi một phương thức đồng bộ (synchronized), bất kỳ tuyến khác hoặc phương thức đồng bộ khác mà cố gắng gọi nó trong thời gian đó sẽ phải đợi Khuyết điểm của các phương thức đồng bộ Trình biên dịch Java từ Sun không chứa nhiều phương thức đồng bộ Các phương thức đồng bộ chậm hơn so với các phương thức tương ứng không đồng bộ. Đồng bộ hoáCác luồng chia sẻ với nhau cùng một không gian bộ nhớ, nghĩa là chúng có thể chia sẻ với nhau các tài nguyên. Khi có nhiều hơn một luồng cùng muốn sử dụng một tài nguyên sẽ xuất hiện tình trạng căng thẳng, ở đó chỉ cho phép một luồng được quyền truy cập. Để cho các luồng chia sẻ với nhau được các tài nguyên và hoạt động hiệu quả, luôn đảm bảo nhất quán dữ liệu thì phải có cơ chế đồng bộ chúng. Java cung cấp cơ chế đồng bộ ở mức cao để điều khiển truy cập của các luồng vào những tài nguyên dùng chung.Các hàm đồng bộKhái niệm semaphore thường được sử dụng để điều khiển đồng bộ các hoạt động truy cập vào những tài nguyên dùng chung. Một luồng muốn truy cập vào một tài nguyên dùng chung (như biến dữ liệu) thì trước tiên nó phải yêu cầu để có được monitor riêng. Khi có được monitor thì luồng như có được “chìa khoá” để “mở cửa” vào miền “tranh chấp” (tài nguyên dùng chung) để sử dụng những tài nguyên đó.Đồng bộ hoá (TT)Cơ chế monitor thực hiện hai nguyên tắc đồng bộ chính:+ Không một luồng nào khác được phân monitor khi có một luồng đã yêu cầu và đang chiếm giữ. Những luồng có yêu cầu monitor sẽ phải chờ cho đến khi monitor được giải phóng. + Khi có một luồng giải phóng (ra khỏi) monitor, một luồng đang chờ monitor có thể truy cập vào tài nguyên dùng chung tương ứng với monitor đó. Mọi đối tượng trong Java đều có monitor, mỗi đối tượng có thể được sử dụng như một khoá loại trừ nhau, cung cấp khả năng để đồng bộ truy cập vào những tài nguyên chia sẻ.Trong lập trình có hai cách để thực hiện đồng bộ: + Các hàm (hàm) được đồng bộ + Các khối được đồng bộĐồng bộ hoá (TT)(i) Các hàm đồng bộHàm của một lớp chỉ cho phép một luồn
File đính kèm:
- baigiangjava.ppt