giao trinh thread .net

8 421 0
giao trinh thread .net

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

Thông tin tài liệu

THREAD Chém định nghĩa: - - - - Thread hay gọi tiểu trình Thread cho phép chương trình thực đồng thời nhiều tác vụ, giúp trình tương tác với người dùng không bị gián đoạn, lập trình song song kĩ thuật thiếu ứng dụng mạng Bạn không nên nhầm lẫn process (tiến trình) thread (tiểu trình) Process hiểu instance chương trình máy tính thực thi, dựa hệ điều hành, hoàn toàn độc lập với tiến trình khác Còn thread nhóm lệnh tạo để thực thi tác vụ process, chúng chia sẻ chung liệu với để xử lý, điều cần thiết nguyên nhân dễ gây lỗi bạn không xử lý cách Tạo phương thức (gọi phương thức callback) thực thi ghi thread gọi: Phương thức phải tham số có tham số kiểu object kiểu trả void Bước bỏ qua ta sử dụng sử dụng anonymous method lambda expression để tạo đoạn mã lệnh thực thi in-line với lệnh khởi tạo thread Tạo đối tượng Thread truyền delegate ThreadStart chứa phương thức thực thi vào constructor Thread Chạy thread: Gọi phương thức Start() đối tượng thread vừa tạo Tạo thực thi thread class DemoThread1 { public static int n = 100000; public void Demo() { Thread t = new Thread(new ThreadStart(MethodA)); t.Start(); MethodB(); Console.ReadLine(); } public void MethodA() { for (int i = 0; i < n; i++) Console.Write("0"); } public void MethodB() { for (int i = 0; i < n; i++) Console.Write("1"); } } Truyền tham số cho Thread - Chỉ chấp nhận tham số kiểu object class DemoThread2 { public void Demo() { Thread thread = new Thread(Print); thread.Start("Long đẹp choai"); Console.ReadLine(); } public void Print(object s) { Console.WriteLine(s); } } Property ThreadState ThreadPriority ThreadState: - Abort: Hủy thread - Suspend: Dừng thread tới gọi lại hàm resume() - Unstarted: Đã khởi tạo chưa gọi hàm start() - Running: Đang chạy - Stopped: Thread dừng - Tham khảo: https://msdn.microsoft.com/enus/library/system.threading.threadstate(v=vs.110).aspx ThreadPriority: - Thuộc tính xác định mức độ ưu tiên mà thread thực thi so với thread khác Mỗi thread tạo mang giá trị priority Normal Các giá trị mà thuộc tính có bao gồm: Lowest, BelowNormal, Normal, AboveNormal Highest Các phương thức thread: - Abort(): phương thức gọi, hệ thống ném ngoại lệ ThreadAbortException để kết thúc thread Sau gọi phương thức này, thuộc tính ThreadState chuyển sang giá trị Stopped - Suspend(): phương thức tạm dừng việc thực thi Thread vô thời hạn yêu cầu chạy tiếp tục với phương thức Resume() Tuy nhiên hai phương thức gắn attribute Obsolete để khuyến cáo bạn nên sử dụng phương pháp khác để thay - Sleep(): để dừng thread khoảng thời gian tính milisecond, thread chuyển sang trạng thái WaitSleepJoin Chú ý phương thức static bạn không cần tạo đối tượng Thread gọi - Join(): phương thức hữu ích trường hợp bạn muốn thực tác vụ sau thread kết thúc Phương thức dùng sau bạn chạy Thread Các tác vụ nằm phía lệnh gọi Join() Thread thực thi sau Thread hoàn tất công việc Ví dụ tầm ảnh hưởng sleep() class DemoThread3 { public static int n = 100000; public void Demo() { Thread thread = new Thread(MethodA); thread.Start(); MethodB(); Console.ReadLine(); } public void MethodA() { Thread.Sleep(2000); for (int i = 0; i < n; i++) Console.Write("@"); } public void MethodB() { for (int i = 0; i < n; i++) Console.Write("|"); } } Ví dụ tầm ảnh hưởng join() class DemoThread4 { public static int n = 100000; public void Demo() { Thread threadA = new Thread(MethodA); Thread threadB = new Thread(MethodB); Thread threadC = new Thread(MethodC); threadA.Start(); threadB.Start(); threadB.Join(); threadC.Start(); } Console.ReadLine(); public void MethodA() { for (int i = 0; i < n; i++) Console.Write("@"); } public void MethodB() { for (int i = 0; i < n; i++) Console.Write("|"); } public void MethodC() { for (int i = 0; i < n; i++) Console.Write("-"); } } Foreground Background Thread - Ứng dụng phân biệt Thread theo hai loại: Foreground thread Background thread Các thread ban đầu tạo foreground Ứng dụng tiếp tục chạy tất foreground thread chưa chạy xong bạn thực lệnh tắt ứng dụng Và tất foreground thread hoàn thành, ứng dụng tắt, đồng thời tất background thread bị “khai tử” theo => Chương trình tắt -> Backgroud quéo Foreground chạy điên cuồng tới cạn kiệt sinh lực - Xét độ ưu tiên, foreground background khác biệt bạn đặt lại giá trị cho chúng Để xác định Thread foreground hay background, bạn sử dụng thuộc tính IsBackground Ví dụ: class DemoThread5 { public static int n = 100100; public void Demo() { Thread thread = new Thread(() => { for (int i = 0; i < n; i++) { Console.Write("1"); } }); // t1.IsBackground = true; thread.Start(); Console.WriteLine("Thread aborted"); } } Thread Pooling - - - - - - Thread Pooling kĩ thuật cho phép bạn sử dụng thread hiệu cách quản lý phân phối chúng hợp lý, tận dụng tối đa thời gian nhàn rỗi tăng hiệu suất chương trình Thread pooling kĩ thuật áp dụng phổ biến ứng dụng I/O bất đồng tập tin truyền tải liệu mạng Mỗi chương trình cung cấp Thread pool khởi tạo, bạn không cần tạo thể thread pool để sử dụng Một đặc điểm Thread pool thread đặt chế độ background (Background Thread) Các tác vụ thêm vào Thread pool thực thi có thread trạng thái sẵn sàng Sau kết thúc tác vụ, thread chuyển trạng thái sẵn sàng để chờ công việc khác Bạn tưởng tượng thread pool giống hàng đợi hay phòng bán vé với mặc định 25 người làm việc, người hoàn tất công việc bán vé cho khách khách hàng đến bắt đầu giao dịch Để sử dụng thread pool, bạn sử dụng phương thức tĩnh QueueUserWorkItem() lớp ThreadPool Phương thức nhận tham số phương thức callback delegate, dùng overload thứ hai để truyền thêm tham số cho phương thức cần thực thi Sau truyền vào thread pool, tác vụ đặt vào hàng đợi sẵn sàng thực thi lúc có thread trạng thái sẵn sàng Bạn thay đổi số thread lớn mà thread pool tạo cách sử dụng phương thức ThreadPool.SetMaxThreads() Trong phiên Net giá trị mặc định không giống nhau, ví dụ phiên Net 2.0 giá trị 25, Net 3.5 250 Bạn kiểm tra điều cách sử dụng phương thức ThreadPool.GetMaxThreads() class DemoThread6 { public static int n = 10; public void Demo() { ThreadPool.QueueUserWorkItem(MethodA); ThreadPool.QueueUserWorkItem(MethodA, "Lần 2"); } - - public void MethodA(object s) { for (int i = 0; i < n; i++) { Console.WriteLine(s); - Thread.Sleep(500); } } } Đồng hóa locking class DemoThread7 { static int amount = 0; public void Demo() { Thread t1 = new Thread(IncreaseAmount); Thread t2 = new Thread(DecreaseAmount); t1.Start(); t2.Start(); } public void IncreaseAmount() { for (int i = 0; i < 100; i++) { amount++; if (amount > 0) { Thread.Sleep(1); Console.Write(amount + "\t"); } } } public void DecreaseAmount() { for (int i = 0; i < 100; i++) { amount ; } } } Deadlock - Đồng hóa sử dụng thread công việc cần thiết, nhiên không cẩn thận bạn gặp phải tình trạng chương trình dừng hoạt động vô thời hạn Tình trạng đặt tên deadlock Deadlock xảy có hai thread đợi thread giải phóng, thật “trùng hợp” hai lại giữ “chìa khóa” - Để dễ hiểu bạn tưởng tượng có hai người hàng xóm bị nhốt hai phòng người lại giữ chìa khóa người Và người đưa chìa khóa cho người không khỏi phòng Rốt hai bị nhốt phòng mãi?

Ngày đăng: 22/08/2016, 17:00

Mục lục

  • Tạo và thực thi thread

  • Truyền tham số cho Thread

  • Chỉ chấp nhận tham số kiểu object

  • Property ThreadState và ThreadPriority

  • Các phương thức của thread:

  • Ví dụ tầm ảnh hưởng của join()

  • Foreground và Background Thread

  • Đồng bộ hóa và locking

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

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

Tài liệu liên quan