Luồng (thread) trong java

8 207 0
Luồng (thread) trong java

Đang tải... (xem toàn văn)

Thông tin tài liệu

Luồng (Thread) Java Luồng (Thread) Java Bởi: unknown Luồng (Thread) Luồng cách thông dụng để nâng cao lực xử lý ứng dụng nhờ vào chế song song Trong hệ điều hành cổ điển, đơn vị sử dụng CPU trình Mỗi trình có Thanh ghi đếm chương trình (PC-Program Counter), Thanh ghi trạng thái (Status Register), ngăn xếp (Stack) không gian địa riêng (Address Space) Ngược lại, hệ điều hành có hỗ trợ tiện ích luồng, đơn vị sử dụng CPU luồng Trong hệ điều hành này, trình bao gồm không gian địa nhiều luồng điều khiển Mỗi luồng có đếm chương trình, trạng thái ghi ngăn xếp riêng Nhưng tất luồng trình chia sẻ không gian địa Nhờ luồng sử dụng biến toàn cục, chia sẻ tài nguyên tập tin, hiệu báo cách dễ dàng Cách thức luồng chia sẻ CPU giống cách thức trình Một luồng có trạng thái: chạy (running), sẵn sàng (ready), nghẽn (blocked) kết thúc (Dead) Một luồng xem trình nhẹ Các trạng thái Luồng 1/8 Luồng (Thread) Java Nhờ vào luồng, người ta thiết kế server đáp ứng nhiều yêu cầu cách đồng thời Sử dụng luồng cho server Trong mô hình này, Server có Luồng phân phát (Dispatcher thread) nhiều Luồng thực (Worker thread) Luồng phân phát tiếp nhận yêu cầu nối kết từ Client, chuyển chúng đến luồng thực rảnh để xử lý Những luồng thực hoạt động song song song song với luồng phân phát, nhờ đó, Server phục vụ nhiều Client cách đồng thời Các mức cài đặt luồng Nhìn từ góc độ hệ điều hành , Luồng cài đặt hai mức: • Trong không gian người dùng (user space) • Trong không gian nhân (kernel mode): Tiếp cận luồng mức người dùng: Kiến trúc luồng cài đặt mức người dùng Không gian người dùng bao gồm hệ thống runtime mà tập hợp thủ tục quản lý luồng Các luồng chạy không gian nằm bên hệ thống runtime quản lý hệ thống Hệ thống runtime lưu giữ bảng tin trạng thái để theo dõi trạng thái hành luồng Tương ứng với luồng có mục 2/8 Luồng (Thread) Java từ bảng, bao gồm thông tin trạng thái, giá trị ghi, độ ưu tiên thông tin khác luồng Tiếp cận có hai mức định thời biểu (Scheduling): định thời biểu cho trình nặng định thời biểu hệ thống runtime Bộ lập biểu hệ thống runtime chia thời gian sử dụng CPU cấp cho trình thành khoảng nhỏ để cấp cho luồng trình Như việc kết thúc luồng vượt tầm kiểm soát kernel hệ thống Tiếp cận luồng mức hạt nhân hệ điều hành Kiến trúc luồng cài đặt mức hệ thống Trong tiếp cận hệ thống runtime luồng quản lý kernel hệ điều hành Vì vậy, bảng thông tin trạng thái tất luồng lưu trữ kernel Tất lời gọi mà làm nghẽn luồng bẫy (TRAP) đến kernel Khi luồng bị nghẽn, kernel chọn luồng khác cho thực thi Luồng chọn trình với luồng bị nghẽn thuộc trình khác Vì tồn luồng biết kernel có mức lập biểu hệ thống Luồng java Trong Java, luồng đối tượng thuộc lớp java.lang.Thread Một chương trình java cài đặt luồng cách tạo lớp lớp java.lang.Thread Lớp có phương thức để điều khiển luồng là: • public native synchronized void start() • public void run() • public final void stop() Phương thức start() Chuẩn bị thứ để thực luồng 3/8 Luồng (Thread) Java Phương thức run() Thực công việc thực luồng, () kích hoạt cách tự động phương thức start() Phương thức stop() Kết thúc luồng Luồng "chết" tất công việc phương thức run() thực phương thức stop() kích hoạt Ví dụ Ví dụ sau định nghĩa lớp MyThread Thread có: • Các thuộc tính ◦ name: tên thread ◦ n: số lần thread xuất hình • Các phương thức: ◦ MyThread(String name, int n): Là phương thức khởi tạo, có nhiệm vụ gán giá trị cho thuộc tính gọi phương thức start() thread hoạt động (start() tự động gọi run()) • run() In n lần dòng thông báo hình kết thúc thread • main() Tạo thread thuộc lớp MyThread có tên Thread0, Thread1, Thread2, Thread3 Mỗi thread có 1000 lần xuất hình Lưu chương trình sau vào tập tin MyThread.java public class MyThread extends Thread{ String name; int n; MyThread(String name, int n){ this.name = name; this.n = n; System.out.println("Thread "+name+" has been created !"); start(); } public void run(){ for(int i=0; i< n; i++) { System.out.println("Hello, I'm "+ name); System.out.println(" I go to bed now, bye bye wow "); } } public static void main(String args[]){ int n = 1000; int nt = ; for (int i=0; i< nt; i++){ MyThread t = new MyThread("Thread"+i,n); } }} 4/8 Luồng (Thread) Java Biên dịch thực thi ta có kết sau: Kết biên dịch chương trình MyThread.java Kết biên dịch chương trình MyThread.java Các Thread in hình theo thứ tự ta xác định trước chúng thực thi song song Để dừng tạm thời hình kết chương trình thực thi, ta nhấp chuột vào cửa số DOS mà chương trình chạy Sau ta nhấn phín Enter để chương trình tiếp tục Ngoài ra, lớp Thread có số phương thức khác : 5/8 Luồng (Thread) Java • public static void sleep(long milliseconds) throws InterruptedException: làm cho Thread bị nghẽn (Blocked) khoảng thời gian mili giây xác định • public final void suspend(): Chuyển Thread từ trạng thái sẳn sàng sang trạng thái nghẽn • public final void resume(): Chuyển Thread từ trạng thái nghẽn sang trạng thái sẵn sàng • public final void yield() : Chuyển Thread từ trạng thái chạy sang trạng thái sẵn sàng Độ ưu tiên luồng Độ ưu tiên luồng xác định mức độ ưu tiên việc phân phối CPU luồng với Khi có nhiều luồng trạng thái "Ready", luồng có độ ưu tiên cao thực thi (chuyển đến trạng thái "running" ) Độ ưu tiên Java định nghĩa số nguyên theo thứ tự giảm dần sau: • Thread.MAX_PRIORITY • Thread.NORM_PRIORITY • Thread.MIN_PRIORITY Hai phương thức liên quan đến độ ưu tiên luồng là: • setPriority( int x): Đặt độ ưu tiên luồng x • int getPriority( ): Trả giá trị ưu tiên luồng Ví dụ: Trong ví dụ tạo 12 Thread thuộc lớp MyThread Một mảng phần tử tên prio chứa độ ưu tiên từ cao đến thấp Thread thứ i có độ ưu tiên vị trí i%3 mảng prio Như thread 0,3,6,9 có độ ưu tiên cao nhất, sau đến Thread 1,4,7,10 cuối thread 2,5,8,11 Lưu chương trình sau vào tập tin PriorityThread.java public class PriorityThread{ public static void main(String args[]){ int n = 1000; int nt = 12; int prio[]= { Thread.MAX_PRIORITY, Thread.NORM_PRIORITY, Thread.MIN_PRIORITY}; for (int i=0; i< nt; i++){ MyThread t = new MyThread("Thread"+i,n); t.setPriority(prio[i%3]); } }} 6/8 Luồng (Thread) Java Kết biên dịch chương trình PriorityThread.java Biên dịch thực thi ta kết sau: 7/8 Luồng (Thread) Java Kết biên dịch chương trình PriorityThread.java Các Thread 0,3,9 có độ ưu tiên cao Thread khác chúng thực thi thường xuyên Các Thread 2,5,8,11 có độ ưu tiên thấp nên chúng kết thúc sau Đồng hóa luồng Tất luồng trình thực thi song song độc lập lại chia sẻ không gian địa trình Chính dẫn đến khả đụng độ việc cập nhật liệu dùng chung chương trình (biến, tập tin mở) luồng ghi lên liệu luồng khác đọc liệu Trong trường hợp đó, cần phải sử dụng chế đồng hóa Java Có nhiều mức đồng hóa như: biến, câu lệnh, khối lệnh hay phương thức 8/8 ... biểu hệ thống Luồng java Trong Java, luồng đối tượng thuộc lớp java. lang.Thread Một chương trình java cài đặt luồng cách tạo lớp lớp java. lang.Thread Lớp có phương thức để điều khiển luồng là: •... t.setPriority(prio[i%3]); } }} 6/8 Luồng (Thread) Java Kết biên dịch chương trình PriorityThread .java Biên dịch thực thi ta kết sau: 7/8 Luồng (Thread) Java Kết biên dịch chương trình PriorityThread .java Các Thread.. .Luồng (Thread) Java Nhờ vào luồng, người ta thiết kế server đáp ứng nhiều yêu cầu cách đồng thời Sử dụng luồng cho server Trong mô hình này, Server có Luồng phân phát (Dispatcher

Ngày đăng: 30/12/2015, 16:42

Mục lục

  • Luồng (Thread) trong Java

  • Luồng (Thread)

    • Các mức cài đặt luồng

      • Tiếp cận luồng ở mức người dùng:

      • Tiếp cận luồng ở mức hạt nhân hệ điều hành

      • Luồng trong java

        • Phương thức start()

        • Độ ưu tiên của luồng 

        • Đồng bộ hóa giữa các luồng

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan