Lập trình đa luồng trong Java
Trang 1 trong tổng số 1 trang
Lập trình đa luồng trong Java
1. Single-Threaded Programming
Khái niệm đa luồng ban đầu sẽ rất khó để nắm bắt. Nhiều các ngôn ngữ lập trình lâu đời hoặc các hệ thống cũ không hỗ trợ lập trình và xử lý đa luồng. Nhiều bạn nghĩ rằng đa luồng không cần thiết, vì họ chưa bao giờ lập trình đa luồng, chưa bao giờ ứng dụng nó vào trong các chương trình của mình
Trong cách thức lập trình truyền thống, sau khi viết xong mã nguồn chương trình sẽ được biên dịch thành một dạng mã mà máy tính có thể hiểu được (machine code). Mã này được khối xử lý trung tâm (CPU) xử lý, chương trình được xử lý một cách tuần tự. Thời gian thực thi các câu lệnh có thể khác nhau, nhưng nếu một câu lệnh chưa được thực hiện xong thì các câu lệnh khác sẽ không được chạy, đó gọi là xử lý đơn luồng (Single-Threaded)
Ưu điểm của lập trình đơn luồng là đơn giản, nếu một câu lệnh không được hoàn thành thì câu lệnh khác sẽ không được thực thi. Điều này giúp cho các bạn dễ dàng tìm kiếm và biết được các lỗi phát sinh ở đâu.
2. Multi-threaded Programming
Lập trình đa luồng đòi hỏi các lập trình viên phải nhìn nhận một cách khác về phần mềm. Thay vì thực hiện một loạt các câu lệnh một cách tuần tự, thì chúng ta có thể thực hiện nhiều câu lệnh, nhiều nhiệm vụ đồng thời. Các câu lệnh được thực hiện cùng một lúc, chứ không phải câu lệnh này thực hiện xong câu lệnh kia mới thực hiện
Một ứng dụng đa luồng có thể thực hiện được nhiều nhiệm vụ trong cùng một thời điểm, cùng một không gian bộ nhớ, và các luồng có thể cho phép chia sẻ các biến dữ liệu để cùng xử lý
3. Multi-threading trong Java
Java cũng giống như nhiều ngôn ngữ lập trình cao cấp khác, hỗ trợ tốt lập trình đa luồng. Trong Java, chúng ta có thể tạo ra các luồng bằng cách sử dụng lớp java. lang.Thread. Ngoài ra chúng ta có thể tạo ra các thread thông qua interface Runable
3. 1. Tạo một ứng dụng multi- threading sử dụng lớp Thread
Lớp Java.lang.Thread cung cấp các phương thức:
Start
Suspend
Resmune
Stop
Cách đơn giản nhất để sử dụng lớp Java.lang.Thread đó là thừa kế lớp này và ghi đè lên phương thức run()
Thread sẽ không được tự động kích hoạt, muốn kích hoạt một thread ta phải sử dụng phương thức start()
Ví dụ về cách tạo thread sử dụng lớp Java.lang.Thread
Ẩn code
package multithreadingdemo;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* @author thangnd
* email: ducthang.se.gr@gmail.com
* website: http://www.vi-infotech.com
*/
public class MultithreadingDemo extends Thread{
int iNumberThread;
//Hàm khởi tạo
public MultithreadingDemo(int iNumThread) {
this.iNumberThread = iNumThread;
}
//Nap chong phuong thuc run
@Override
public void run() {
switch (iNumberThread) {
case 1:
System.out.println(“Thred thu 1 xu ly: “);
Thread_A();
break;
case 2:
System.out.println(“Thred thu 2 xu ly: “);
Thread_B();
break;
case 3:
System.out.println(“Thred thu 3 xu ly: “);
Thread_C();
break;
}
try {
//Thoi gian cho doi xu ly
//1000 = 1 giay
Thread.sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(MultithreadingDemo.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println(“Thred ” + iNumberThread + ” da xu ly xong!”);
}
public static void main(String[] args) {
Thread t1 = new MultithreadingDemo(1);
Thread t2 = new MultithreadingDemo(2);
Thread t3 = new MultithreadingDemo(3);
t1.start();
t2.start();
t3.start();
}
//Cac hanh dong cho cac thread tuong ung
private static void Thread_A() {
for (int i= 0; i< 100; i++){
System.out.print(“+ “);
}
System.out.print(“\n “);
}
private static void Thread_B() {
for (int i= 0; i< 100; i++){
System.out.print(“- “);
}
System.out.print(“\n “);
}
private static void Thread_C() {
for (int i= 0; i< 100; i++){
System.out.print(“o “);
}
System.out.print(“\n “);
}
}
Sau khi phương thức start() của một thread được gọi, thì thread này sẽ gửi một yêu cầu để tạo ra thread riêng biệt, sau đó phương thức run được xử lý
Trong đoạn code trên bạn có thể thấy dòng lênh sau Thread.sleep(1000). Dòng lệnh này chính là thời gian chờ để các thread được xử lý, thời gian chờ càng lớn thì thời gian hiển thị kết quả càng lâu.
Userthread & Deamonthread
Khi tạo ra một thread mới thì Java mặc định coi đó là UserThread. Trong Java, Hàm main cũng là một thread riêng biệt.
Đối với UserThread khi hàm main thực thi xong các câu lệnh của mình thì sẽ chưa thoát khỏi chương trình ngay mà còn đợi các UserThread xử lý xong mới ngừng chương trình
Đối với DeamonThread, nếu tất cả các thread đều được gán là DeamonThread thì Java sẽ tính thời gian sleep của hàm main và thời gian sleep của các thread để quyết định xem dữ liệu được xử lý như thế nào.
Giả sử khi hàm main đặt thời gian sleep là 1 giây (hoặc không cần đặt thời gian sleep), các thread khác được gán là DeamonThread và đặt thời gian sleep là 2 giây, thì sau khi khởi tạo xong các thread hàm start được gọi tới nhưng các phương thức trong hàm run sẽ chưa được thực thi, và ngược lại
Nếu muốn sử dụng DeamonThread một cách có hiệu quả thì cần phải có sự tính toán thời gian sleep giữa các thread và thời gian sleep của chính hàm main, nếu thời gian sleep của các thread đặt một cách không chính xác sẽ dẫn tới sau khi chương trình kết thúc mà các thread vẫn chưa xử lý song nhiệm vụ của mình.
Chú ý: Trong các thread chỉ cần có một thread chưa được gán là DeamonThread thì chương trình vẫn sẽ xử lý giống với UserThread
3. 2. Tạo một ứng dụng multi- threading sử dụng interface Runable
Sử dụng lớp Java.lang.Thread là một cách đơn giản để tạo ra một ứng dụng đa luồng, nhưng đó chưa phải là cách tốt nhất. Chúng ta nên nhớ rằng trong Java chỉ hỗ trợ đơn thừa kế (single inheritance) không giống như ngôn ngữ C++, hỗ trợ đa thừa kế. Điều đó cũng có nghĩa rằng nếu một lớp đã được thừa kế từ một lớp khác thì nó không thể nào thừa kế từ lớp Java.lang.Thread được nữa
Ví dụ: Chúng ta tạo một ứng dụng xử lý đa luồng cho quản lý nhân viên. Khi lớp nhân viên kế thừa từ lớp từ lớp người thì nó sẽ không tiếp tục kế thừa từ lớp Java.lang.Thread
Một cách thức để tạo ra một ứng dụng đa luồng đó là implement từ Interface java.lang.Runnable
Inteface Runnable, cung cấp một phương thức duy nhất run(). Khi gọi phương thức start() của thread thì phương thức run() của Inteface Runnable cũng được thực thi
Ví dụ về cách tạo thread sử dụng Inteface Runnable
Ẩn code
package demorunnablethread;
/**
* @author thangnd
* email: ducthang.se.gr@gmail.com
* website: http://www.vi-infotech.com
*/
public class DemoRunnableThread implements Runnable {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
Runnable run = new DemoRunnableThread();
System.out.println(“tao thead 1: “);
Thread t1 = new Thread(run);
System.out.println(“tao thead 2: “);
Thread t2 = new Thread(run);
System.out.println(“chay 2 thread”);
t1.start();
t2.start();
}
@Override
public void run() {
System.out.println(“I am an instance of the Runnable”);
}
}
Khái niệm đa luồng ban đầu sẽ rất khó để nắm bắt. Nhiều các ngôn ngữ lập trình lâu đời hoặc các hệ thống cũ không hỗ trợ lập trình và xử lý đa luồng. Nhiều bạn nghĩ rằng đa luồng không cần thiết, vì họ chưa bao giờ lập trình đa luồng, chưa bao giờ ứng dụng nó vào trong các chương trình của mình
Trong cách thức lập trình truyền thống, sau khi viết xong mã nguồn chương trình sẽ được biên dịch thành một dạng mã mà máy tính có thể hiểu được (machine code). Mã này được khối xử lý trung tâm (CPU) xử lý, chương trình được xử lý một cách tuần tự. Thời gian thực thi các câu lệnh có thể khác nhau, nhưng nếu một câu lệnh chưa được thực hiện xong thì các câu lệnh khác sẽ không được chạy, đó gọi là xử lý đơn luồng (Single-Threaded)
Ưu điểm của lập trình đơn luồng là đơn giản, nếu một câu lệnh không được hoàn thành thì câu lệnh khác sẽ không được thực thi. Điều này giúp cho các bạn dễ dàng tìm kiếm và biết được các lỗi phát sinh ở đâu.
2. Multi-threaded Programming
Lập trình đa luồng đòi hỏi các lập trình viên phải nhìn nhận một cách khác về phần mềm. Thay vì thực hiện một loạt các câu lệnh một cách tuần tự, thì chúng ta có thể thực hiện nhiều câu lệnh, nhiều nhiệm vụ đồng thời. Các câu lệnh được thực hiện cùng một lúc, chứ không phải câu lệnh này thực hiện xong câu lệnh kia mới thực hiện
Một ứng dụng đa luồng có thể thực hiện được nhiều nhiệm vụ trong cùng một thời điểm, cùng một không gian bộ nhớ, và các luồng có thể cho phép chia sẻ các biến dữ liệu để cùng xử lý
3. Multi-threading trong Java
Java cũng giống như nhiều ngôn ngữ lập trình cao cấp khác, hỗ trợ tốt lập trình đa luồng. Trong Java, chúng ta có thể tạo ra các luồng bằng cách sử dụng lớp java. lang.Thread. Ngoài ra chúng ta có thể tạo ra các thread thông qua interface Runable
3. 1. Tạo một ứng dụng multi- threading sử dụng lớp Thread
Lớp Java.lang.Thread cung cấp các phương thức:
Start
Suspend
Resmune
Stop
Cách đơn giản nhất để sử dụng lớp Java.lang.Thread đó là thừa kế lớp này và ghi đè lên phương thức run()
Thread sẽ không được tự động kích hoạt, muốn kích hoạt một thread ta phải sử dụng phương thức start()
Ví dụ về cách tạo thread sử dụng lớp Java.lang.Thread
Ẩn code
package multithreadingdemo;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* @author thangnd
* email: ducthang.se.gr@gmail.com
* website: http://www.vi-infotech.com
*/
public class MultithreadingDemo extends Thread{
int iNumberThread;
//Hàm khởi tạo
public MultithreadingDemo(int iNumThread) {
this.iNumberThread = iNumThread;
}
//Nap chong phuong thuc run
@Override
public void run() {
switch (iNumberThread) {
case 1:
System.out.println(“Thred thu 1 xu ly: “);
Thread_A();
break;
case 2:
System.out.println(“Thred thu 2 xu ly: “);
Thread_B();
break;
case 3:
System.out.println(“Thred thu 3 xu ly: “);
Thread_C();
break;
}
try {
//Thoi gian cho doi xu ly
//1000 = 1 giay
Thread.sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(MultithreadingDemo.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println(“Thred ” + iNumberThread + ” da xu ly xong!”);
}
public static void main(String[] args) {
Thread t1 = new MultithreadingDemo(1);
Thread t2 = new MultithreadingDemo(2);
Thread t3 = new MultithreadingDemo(3);
t1.start();
t2.start();
t3.start();
}
//Cac hanh dong cho cac thread tuong ung
private static void Thread_A() {
for (int i= 0; i< 100; i++){
System.out.print(“+ “);
}
System.out.print(“\n “);
}
private static void Thread_B() {
for (int i= 0; i< 100; i++){
System.out.print(“- “);
}
System.out.print(“\n “);
}
private static void Thread_C() {
for (int i= 0; i< 100; i++){
System.out.print(“o “);
}
System.out.print(“\n “);
}
}
Sau khi phương thức start() của một thread được gọi, thì thread này sẽ gửi một yêu cầu để tạo ra thread riêng biệt, sau đó phương thức run được xử lý
Trong đoạn code trên bạn có thể thấy dòng lênh sau Thread.sleep(1000). Dòng lệnh này chính là thời gian chờ để các thread được xử lý, thời gian chờ càng lớn thì thời gian hiển thị kết quả càng lâu.
Userthread & Deamonthread
Khi tạo ra một thread mới thì Java mặc định coi đó là UserThread. Trong Java, Hàm main cũng là một thread riêng biệt.
Đối với UserThread khi hàm main thực thi xong các câu lệnh của mình thì sẽ chưa thoát khỏi chương trình ngay mà còn đợi các UserThread xử lý xong mới ngừng chương trình
Đối với DeamonThread, nếu tất cả các thread đều được gán là DeamonThread thì Java sẽ tính thời gian sleep của hàm main và thời gian sleep của các thread để quyết định xem dữ liệu được xử lý như thế nào.
Giả sử khi hàm main đặt thời gian sleep là 1 giây (hoặc không cần đặt thời gian sleep), các thread khác được gán là DeamonThread và đặt thời gian sleep là 2 giây, thì sau khi khởi tạo xong các thread hàm start được gọi tới nhưng các phương thức trong hàm run sẽ chưa được thực thi, và ngược lại
Nếu muốn sử dụng DeamonThread một cách có hiệu quả thì cần phải có sự tính toán thời gian sleep giữa các thread và thời gian sleep của chính hàm main, nếu thời gian sleep của các thread đặt một cách không chính xác sẽ dẫn tới sau khi chương trình kết thúc mà các thread vẫn chưa xử lý song nhiệm vụ của mình.
Chú ý: Trong các thread chỉ cần có một thread chưa được gán là DeamonThread thì chương trình vẫn sẽ xử lý giống với UserThread
3. 2. Tạo một ứng dụng multi- threading sử dụng interface Runable
Sử dụng lớp Java.lang.Thread là một cách đơn giản để tạo ra một ứng dụng đa luồng, nhưng đó chưa phải là cách tốt nhất. Chúng ta nên nhớ rằng trong Java chỉ hỗ trợ đơn thừa kế (single inheritance) không giống như ngôn ngữ C++, hỗ trợ đa thừa kế. Điều đó cũng có nghĩa rằng nếu một lớp đã được thừa kế từ một lớp khác thì nó không thể nào thừa kế từ lớp Java.lang.Thread được nữa
Ví dụ: Chúng ta tạo một ứng dụng xử lý đa luồng cho quản lý nhân viên. Khi lớp nhân viên kế thừa từ lớp từ lớp người thì nó sẽ không tiếp tục kế thừa từ lớp Java.lang.Thread
Một cách thức để tạo ra một ứng dụng đa luồng đó là implement từ Interface java.lang.Runnable
Inteface Runnable, cung cấp một phương thức duy nhất run(). Khi gọi phương thức start() của thread thì phương thức run() của Inteface Runnable cũng được thực thi
Ví dụ về cách tạo thread sử dụng Inteface Runnable
Ẩn code
package demorunnablethread;
/**
* @author thangnd
* email: ducthang.se.gr@gmail.com
* website: http://www.vi-infotech.com
*/
public class DemoRunnableThread implements Runnable {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
Runnable run = new DemoRunnableThread();
System.out.println(“tao thead 1: “);
Thread t1 = new Thread(run);
System.out.println(“tao thead 2: “);
Thread t2 = new Thread(run);
System.out.println(“chay 2 thread”);
t1.start();
t2.start();
}
@Override
public void run() {
System.out.println(“I am an instance of the Runnable”);
}
}
MaiThiHongTham70 (113A)- Tổng số bài gửi : 32
Join date : 07/08/2012
Similar topics
» Lập trình đa luồng trong java
» Thảo luận Bài 5 (Đa luồng)
» Thảo luận Bài 5
» Giới thiệu về Threads-lập trình đa luồng trong Java
» Thảo luận Bài 5
» Thảo luận Bài 5 (Đa luồng)
» Thảo luận Bài 5
» Giới thiệu về Threads-lập trình đa luồng trong Java
» Thảo luận Bài 5
Trang 1 trong tổng số 1 trang
Permissions in this forum:
Bạn không có quyền trả lời bài viết