2013-07-24 26 views
5

Tôi đã đọc rằng các luồng Java là các luồng cấp người dùng và một trong những sự khác biệt giữa các luồng cấp người dùng và các luồng cấp hạt nhân là các luồng cấp hạt nhân được hoạch định bởi hạt nhân (chúng ta không thể thay đổi nó) đối với các chủ đề cấp người dùng, chúng tôi có thể xác định thuật toán lập lịch của riêng mình.Làm thế nào để lên lịch các luồng Java

Vậy làm cách nào để chúng tôi lên lịch các chuỗi trong Java? Tại bất kỳ thời điểm nào, khi nhiều luồng đã sẵn sàng để được thực hiện, hệ thống thời gian chạy chọn luồng Runnable có mức ưu tiên cao nhất để thực thi. Nếu hai luồng có cùng mức độ ưu tiên đang chờ CPU, trình lên lịch chọn một trong số chúng để chạy theo kiểu vòng tròn. Nếu tôi không muốn RR thì sao? có cách nào tôi có thể thay đổi nó hay tôi đang thiếu thứ gì đó ở đây?

+3

Cố gắng thay đổi các cài đặt cấp thấp như vậy của JVM thường là một ý tưởng rất tồi. Vấn đề bạn đang cố gắng giải quyết với việc thay đổi thứ tự thực hiện của chủ đề là gì? – ssindelar

Trả lời

8

Bạn không thể thay đổi thuật toán lập lịch như đối với JVM này nằm ngoài phạm vi. JVM sử dụng luồng luồng người dùng được cung cấp bởi hệ điều hành bên dưới.

Vì vậy, từ phối cảnh Java, bạn không thể thay đổi thuật toán lập lịch. Việc lên lịch được thực hiện tự động.

Điều duy nhất trong Java bạn có thể làm là set the priority of the thread. Nhưng làm thế nào điều này ảnh hưởng đến thuật toán lập kế hoạch không được xác định.

Bạn có thể thử thay đổi thuật toán lập lịch của HĐH nơi máy ảo của bạn đang chạy. Nhưng điều này phụ thuộc rất nhiều vào hệ điều hành được sử dụng.

2

Trong 10 năm qua, các chủ đề JVM là các luồng cấp hệ thống chứ không phải chủ đề cấp người dùng ('xanh'). Ngay cả đối với các chủ đề cấp người dùng, bạn không thể quản lý chúng (JVM làm).

1

Thông số JVM không chỉ ra cách các luồng được dự kiến ​​sẽ được thực hiện theo lịch. Hotspot VM (và hầu như tất cả các triển khai khác) đều sử dụng các cơ chế lập lịch biểu của hệ điều hành (như Uwe đã nói). Xem thêm What is the JVM Scheduling algorithm?.

Một cách đơn giản, nhưng rất có thể không hiệu quả để ảnh hưởng lên lịch trình của các chuỗi ứng dụng của bạn sẽ chỉ có n chuỗi chạy được cho hệ điều hành để lên lịch (n là số lượng chủ đề bạn thực sự muốn chạy song song). Điều đó có thể, ví dụ: được thực hiện của riêng bạn của ExecutorService, mà làm cho tất cả các chủ đề bạn không muốn được lên lịch bởi hệ điều hành chờ đợi cho đến khi bạn nghĩ rằng họ nên chạy. Tất nhiên theo cách này bạn không có bất kỳ ảnh hưởng nào đến các chủ đề VM khác, hãy để một mình các ứng dụng khác hoặc hệ điều hành.

Tham gia nhiều hơn (và không độc lập với plattform) sẽ thay đổi chính lịch biểu của hệ điều hành thành thứ gì đó phù hợp hơn với nhu cầu của JVM. Một nghiên cứu google nhanh chóng tìm thấy this abstract và tôi đoán có nhiều công việc hơn được thực hiện trên trường đó.

0

Trong Java hiệu quả, 2nd Ed., Joshua Bloch dành một mục để thảo luận về lập lịch trình chuỗi. Ông đi vào chiều dài về cách cố gắng để tinh chỉnh lập kế hoạch thread thường chỉ dẫn đến các giải pháp được thực hiện JVM phụ thuộc, không di động, và mong manh.

Nếu có sự cố lập lịch cụ thể mà bạn có, thì đối với mã mới, bạn không nên xử lý các cuộc gọi luồng cấp thấp. Java có các thư viện đồng thời mức cao hơn giúp đơn giản hóa nhiều tác vụ này. Thay vì xác định giải pháp cho vấn đề của bạn với chủ đề, bạn nên suy nghĩ về Executors and Tasks. Ngoài ra còn có các cơ sở cấp cao hơn giúp đơn giản hóa giao tiếp giữa các luồng, chẳng hạn như CountDownLatch.

Cuộc gọi luồng cấp thấp như chờ, thông báo và thông báoTất cả có thể khó thực hiện đúng cách.

0

Bạn có thể viết trình lập lịch trình chuỗi của riêng mình, tương tự như Quartz job scheduler cho công việc theo lô.

Điều này sẽ cho phép bạn thực hiện chuỗi tại các thời điểm khác nhau trong ngày trong khi chạy ứng dụng của bạn.

Nếu tất cả những gì bạn muốn là xác định thứ tự thực hiện chuỗi của bạn, hãy thực thi mã từ một chuỗi chủ.

Các vấn đề liên quan