Java Thread là gì? (What is Java Thread?)




Thread dịch nghĩa việt có nghĩa là luồng, tương tự Threads hay MultiThreading có nghĩa là đa luồng. Luồng ở đây ta có thể hiểu là một dòng các điều khiển trong một tiến trình(process) hay một ứng dụng(application).

Bài viết này ta sẽ tìm hiểu một số khái miện cơ bản về Thread Threads trong ngôn ngữ lập trình Java.




Chắc các bạn đều biết các công nghệ CPU hiện nay như Pentium 4,Dual Core và Quad Core của Intel hoặc AMD, Pentium 4 thì chỉ thực hiện 1 tiến trình tại một thời điểm, Dual Core thì có phép thực hiện 2 tiến trình cùng một lúc, Quad Core thì cho phép thực hiện đồng thời 4 tiến trình, trên lý thuyết thì Thread tương tự với Pentium 4 và Threads tương tự như Dual Core và Quad Core.

Từ ví dụ thực tiễn trên bạn có thể hình dung ra được cơ chế hoạt đông của Thread và Threads, nhưng bạn lưu ý Thread ở đây không phải là một tiến trình(process) mà mà dòng thực hiện các điểu hay các câu lệnh trong một process hay applicaiton.

Một ví dụ khác là khi ta coding một ứng dụng thì ta đều biết các câu lệnh thường thực hiện theo qui tắc là câu lệnh A rồi tới câu lệnh B thì đây được gọi là Thread(luồng), còn nếu như ta có thể chạy câu lệnh Acâu lệnh B cùng một lúc thì ta gọi nó là Threads hay MultiThreading(đa luồng).

Theo định nghĩa được mô tả từ Java thì Thread(luồng) lòa cơ sở cho phép ứng dụng chạy nhiều nhiệm vụ cùng một lúc trong cùng một tiến trình(single process). Các Threads(đa luồng) thì độc lập, cùng được thưc thi đồng thời thông một chương trình.

Trong Java threads có thể được thực hiện bằng 2 cách. Một là bởi 'Extending Thread Class' và một là ởi 'Implementing Runnable Interface'.

Extending Thread Class thì yêu cầu phương thức 'override run()'(ghi đè). Phương thức chạy này chứa logic thực tế để thực hiện một Thread.

Khi tạo một đối tượng Thread(Object Thread) thì nó sẽ không được thực thi, để thực thi ta cần gọi phương thức 'start()'.

Một số phương thức cơ bản trong Thread.

  • start(): Được dùng để chính thức khởi tạo một thread.
  • run(): Sau khi một thread được khởi tạo bởi phương thức start thì dùng run() để thực thì các dòng lệnh thread này.
  • join()|join(long millisec): Là phương thức được gọi từ một thread khác, khi gọi phương thức này thread gọi phải ngưng hoạt động và chờ cho tới khi thread được gọi kết thúc hoặc theo thời gian chờ được thiết lập(long millisec), giả sử ta có 2 thread A và B, trong thread A ta sẽ gọi thread B.join() thì thread A phải chờ cho tới khi thread B được thực thi xong thì thread A mới tiếp tục chạy.
  • sleep(long millisec): Phương thức này sẽ bắt buộc Thread sẽ phải ngưng hoạt động trong khoảng thời gian được thiết lập(long millisec) thì mới được thực thi tiếp.
  • yield(): Phương thức này sẽ làm cho Thread hiện thời đang chạy tạm ngưng hoạt động và ưu tiên cho một thread đang chời đợi khác.
  • wait(): Phương thức này được kế thừa từ lớp Object, nó sẽ làm cho thread hiện tại phải chờ đợi cho đến khi một thread khác gọi phương thức notify() hoặc notifyAll() của đối tượng thread sử dụng wait().
  • notify()|notifyALL: Phương thức này được kế thừa từ lớp Object, nó dùng để gọi một đối tượng thread đang chờ đợi(thread sử dụng wait()) hoặc tất cả các thread đang chờ được hoạt động.

Ta sẽ đi qua một ví dụ đơn giản về về Thread để có thể hiểu rõ hơn, định nghĩa có hiểu quá .:^-^:.

/**
 * @(#)JavaThread.java
 *
 * JavaThread application
 *
 * @author BUI NGOC SON
 * @version 1.00 2014/2/11
 */

public class JavaThread {
   
    public static void main(String[] args) {
       
        new childThread(); // create a new thread is child thread.
       
        try
        {
            for(int i = 5; i > 0; i--)
            {
                System.out.println("Main Thread: " + i);
                Thread.sleep(100);
            }
        }
        catch (InterruptedException e)
        {
            System.out.println("Main thread interrupted.");
        }
       
        System.out.println("Main thread exiting.");

    }
}

class childThread implements Runnable
{
    Thread t;

    public childThread()
    {
        // Create a new, second thread
        t = new Thread(this, "Child Thread");
        System.out.println("Child thread: " + t);
        t.start(); // Start the thread
    }
   
    // This is the entry point for the second thread.
    public void run()
    {
        try
        {
            for(int i = 5; i > 0; i--)
            {
                System.out.println("Child Thread: " + i);
                // Let the thread sleep for a while.
                Thread.sleep(50);
            }
        }
        catch (InterruptedException e)
        {
            System.out.println("Child interrupted.");
        }
        System.out.println("Exiting child thread.");
    }
   
}

Sau khi chạy ứng dụng ta thấy được kết quả sau:


Trong trường hợp ta không bàn về vấn Thread trong đoạn code trên của tôi thì ta sẽ ngĩ rằng các lệnh trong lớp "new childThread();" phải được thực thi xong thì các đoạn code bên dưới bên được thực thì.

Nhưng ở đay ta sử dung Threads vì vậy kết quả ta nhận được là câu lệnh "prinltln" Main Thread và Child Thread in ra lẫn lộn, điều này chứng minh là 2 threads này được thực hiện song song với nhau.

Vì khái miện và các trường hợp về Thread rất nhiều, nên tôi sẽ trình bày thêm các ví dụ và cách sử dụng các method của Thread trong các bài sau theo từng trường hợp thực tiễn cụ thể để ta có thể hiểu rõ hơn về Thread. Mong các bạn đón theo dõi .^_^.
















No comments:

Post a Comment