2013-03-11 26 views
6

Tài liệu cho ScheduledThreadPoolExecutor nói rằng - Các tác vụ được lên lịch chính xác cùng thời gian thực hiện được bật trong thứ tự gửi đầu tiên (FIFO) đầu tiên.Được ScheduledThreadPoolExecutor ok để thực hiện nhiều tác vụ cùng một lúc?

Điều này có nghĩa là các công việc cần được thực hiện cùng một lúc sẽ không bao giờ được thực hiện cùng một lúc. Thay vào đó chúng được thực thi theo thứ tự FIFO?

Nếu điều đó đúng thì lớp nào tôi sử dụng tốt hơn Timer và cũng không có vấn đề về FIFO này?

Trả lời

4

Cách hoạt động của ScheduledThreadPoolExecutor là có một chuỗi "lập lịch" hoặc chủ chính để kiểm tra các tác vụ cần thực hiện.

Nếu tìm thấy tác vụ, nó sẽ gán nó cho một chuỗi "công nhân" từ hồ bơi.

Nếu có nhiều tác vụ sẵn sàng để thực hiện, chúng được "khởi động" từng lần một, mặc dù một lần "khởi động", xử lý tiếp theo đồng thời, theo định nghĩa của Java.

Nếu bạn có hai tác vụ được lên lịch thông qua trình thực thi cùng lúc, thứ tự hoàn thành có thể thay đổi từ khi chạy đến và trừ khi bạn đặt các điều khiển cụ thể như khóa, chờ, v.v ... để xử lý điều này, nó lên đến lập kế hoạch thread của java (làm thế nào java allots thời gian để đề trên một lõi) để xác định như thế nào và khi những gì được xử lý. Xin lưu ý rằng việc thiết lập các khóa như vậy, chờ đợi, vv ... là một nhiệm vụ phức tạp dễ bị tấn công do các điều kiện chủng tộc dẫn đến các khóa chết bất ngờ, khóa trực tiếp, ...

+0

Cảm ơn. Tôi có thể nhận được một số hướng dẫn tốt về ScheduledThreadPoolExecutor ở đâu? Tôi thực sự cần giải thích về cách những điều này hoạt động, thay vì chỉ tài liệu API. Nhờ bạn, tôi có một sự hiểu biết tốt hơn về mục đích của mỗi lớp. :) – Time

+0

Vâng, tôi khuyên bạn nên quay lại đầu tiên và xem xét các yêu cầu của bạn là gì về mặt đồng thời. Khi bạn gửi một cái gì đó đến một hồ bơi thread, suy nghĩ là "Nó sẽ được thực hiện, khá gần khi tôi muốn nó".Nếu bạn cần một số runnables thực hiện trong lockstep, lưu ý rằng đây là một thường khó khăn để đáp ứng yêu cầu và xem xét nới lỏng này lên nếu có thể. Nếu bạn muốn đăng một số chi tiết, tôi rất sẵn lòng trợ giúp. Một nơi tốt để bắt đầu tìm hiểu thêm về những gì java đã có ở đây: http://docs.oracle.com/javase/tutorial/essential/concurrency/ – Taylor

+0

Xin vui lòng cho tôi biết điều này có nghĩa là gì - bạn cần một số runnables thực hiện trong lockstep. Nếu tôi biết ý nghĩa, thì tôi có thể nói với bạn nếu đó là yêu cầu của tôi. Cảm ơn. – Time

1

Tùy thuộc vào kích thước của nhóm chủ đề của bạn. Nếu bạn lên lịch 1000 nhiệm vụ để kích hoạt vào lúc nửa đêm và bạn chỉ có 25 luồng, thì chỉ có 25 tác vụ có thể được thực thi ban đầu, trong khi phần còn lại phải đợi cho các chuỗi có sẵn. FIFO ở đây đề cập đến thứ tự mà trong đó người thực thi sẽ giao nhiệm vụ cho các chủ đề thực thi.

+0

Ok, vì vậy số lượng chuỗi phải>> số tác vụ? ">" được bao gồm cho một lề an toàn trong trường hợp chúng tôi không biết có bao nhiêu công việc có thể phải được thực hiện tại một thời điểm nhất định. – Time

+1

@Thời gian: Các tác vụ có thực sự cần xảy ra đồng thời không? Nó có thể giúp đỡ nếu bạn có thể giải thích các yêu cầu lái xe này. – Taylor

+1

Như câu trả lời khác đã chỉ ra, thời gian dự kiến ​​là thời gian mà một nhiệm vụ sẽ được gửi đến hồ bơi thực hiện. Đó là một quyết định thiết kế bao nhiêu chủ đề bạn muốn, nhớ lại rằng thực thi đồng thời đúng yêu cầu thực hiện song song, được giới hạn bởi lõi của phần cứng của bạn. –

1

Xin lưu ý rằng các tài liệu nói về "bật" công việc và chúng ta đang nói về một người thực hiện threadpool. :-)

Điều đó có nghĩa là các tác vụ sẽ đợi cho đến khi thời gian được chỉ định, sau đó chúng được xử lý như được đưa vào một ThreadPoolExecutor bình thường. Nếu có đủ chủ đề có sẵn trong nhóm, tất cả các tác vụ này sẽ được chạy song song.

Chỉ khi bạn có nhiều tác vụ trở nên hoạt động hơn các chủ đề có sẵn trong nhóm, một số tác vụ sẽ phải đợi.

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