Trong Java, chúng ta có 2 cách để khởi tạo và chạy một thread, đó là sử dụng class Thread hoặc là interface Runnable. Cụ thể như thế nào, trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu về chúng các bạn nhé!
Class Thread
Các bạn có thể dễ dàng tạo mới một thread bằng cách extend class của các bạn từ class Thread rồi sau đó override phương thức run() của class Thread này. Code bên trong run() method sẽ là tác vụ mà chúng ta cần execute trong thread mới.
Ví dụ mình muốn tạo mới một thread để tính tổng của 2 số bằng cách extend class Thread thì mình sẽ tạo mới một class extend class Thread và override lại phương thức run() như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package com.huongdanjava.javaexample; public class Calculator extends Thread { @Override public void run() { int a = 2; int b = 7; int sum = a + b; System.out.println(sum); } } |
Để chạy thread trong trường hợp này, chúng ta sẽ tạo mới instance của class Calculator và gọi phương thức start() của đối tượng này để chạy các bạn nhé. Ví dụ:
1 2 3 4 5 6 7 8 9 10 |
package com.huongdanjava.javaexample; public class Example { public static void main(String[] args) { Calculator calculator = new Calculator(); calculator.start(); } } |
Kết quả:
Các bạn có thể thấy rõ việc code của chúng ta được execute trong main thread hay là một thread khác bằng cách add thêm một số dòng code như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package com.huongdanjava.javaexample; public class Calculator extends Thread { @Override public void run() { System.out.println("Calculator : " + Thread.currentThread().getName()); int a = 2; int b = 7; int sum = a + b; System.out.println(sum); } } |
1 2 3 4 5 6 7 8 9 10 11 12 |
package com.huongdanjava.javaexample; public class Example { public static void main(String[] args) { System.out.println("Main : " + Thread.currentThread().getName()); Calculator calculator = new Calculator(); calculator.start(); } } |
Kết quả:
Nếu các bạn để ý thì sẽ có thắc mắc là nếu chúng ta gọi phương thức run() thay vì phương thức start() của class Calculator thì có sự khác biệt gì? Câu trả lời là nếu các bạn gọi phương thức run() thì code bên trong nó sẽ được execute trong cùng thread của chương trình thay vì một thread mới.
Ví dụ nếu bây giờ mình đổi qua gọi phương thức run() trong hàm main của ứng dụng:
1 2 3 4 5 6 7 8 9 10 11 12 |
package com.huongdanjava.javaexample; public class Example { public static void main(String[] args) { System.out.println("Main : " + Thread.currentThread().getName()); Calculator calculator = new Calculator(); calculator.run(); } } |
các bạn sẽ thấy kết quả như sau:
Interface Runnable
Với interface Runnable thì class của các bạn cần implement interface này và hiện thực phương thức run() được định nghĩa trong nó.
Trong ví dụ trên, thay vì extend từ class Thread mình có thể implement interface Runnable như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package com.huongdanjava.javaexample; public class Calculator implements Runnable { public void run() { System.out.println("Calculator : " + Thread.currentThread().getName()); int a = 2; int b = 7; int sum = a + b; System.out.println(sum); } } |
Để tạo mới thread và chạy ứng dụng của chúng ta trong trường hợp này, các bạn cần tạo mới class Thread với tham số là class implement interface Runnable của chúng ta. Ví dụ như sau:
1 2 3 4 5 6 7 8 9 10 11 12 |
package com.huongdanjava.javaexample; public class Example { public static void main(String[] args) { System.out.println("Main : " + Thread.currentThread().getName()); Thread thread = new Thread(new Calculator()); thread.start(); } } |
Kết quả cũng như vậy:
Tổng kết
Việc sử dụng extend class Thread hay implement interface Runnable là tuỳ vào nhu cầu của các bạn nhưng mình prefer việc implement interface Runnable hơn vì trong Java, chúng ta có thể implement nhiều interface khác nhau nhưng chỉ có thể extend từ một class nào đó.