Câu trả lời của Andrzej đã đề cập đến hầu hết mọi thứ trong câu hỏi của bạn. Đáng nói đến là bối cảnh thực thi ngầm định "mặc định" của Scala (import scala.concurrent.ExecutionContext.Implicits._
) là theo nghĩa đen a java.util.concurrent.Executor
và toàn bộ khái niệm ExecutionContext là một trình bao bọc rất mỏng, nhưng được liên kết chặt chẽ với khung thực thi của Java.
Để đạt được điều gì đó tương tự như tương lai đã lên lịch, như Mauricio đã chỉ ra, bạn sẽ phải sử dụng lời hứa và bất kỳ cơ chế lập lịch biểu của bên thứ ba nào.
Không có cơ chế chung cho điều này được xây dựng vào Scala 2.10 tương lai là một điều đáng tiếc, nhưng không có gì gây tử vong.
Lời hứa là xử lý cho tính toán không đồng bộ. Bạn tạo một (giả sử ExecutionContext
trong phạm vi) bằng cách gọi val p = Promise[Int]()
. Chúng tôi vừa hứa một số nguyên.
Khách hàng có thể lấy một tương lai phụ thuộc vào lời hứa đang được thực hiện, chỉ cần gọi p.future
, đó chỉ là một tương lai Scala.
Thực hiện lời hứa đơn giản chỉ là vấn đề gọi số p.successful(3)
, tại thời điểm đó tương lai sẽ hoàn thành.
Phát 2.x giải quyết lịch biểu bằng cách sử dụng lời hứa và đồng bộ cũ 1,4 giờ Java.
Here là liên kết chống liên kết tới nguồn.
Chúng ta hãy xem xét các nguồn ở đây:
object Promise {
private val timer = new java.util.Timer()
def timeout[A](message: => A, duration: Long, unit: TimeUnit = TimeUnit.MILLISECONDS)
(implicit ec: ExecutionContext): Future[A] = {
val p = Promise[A]()
timer.schedule(new java.util.TimerTask {
def run() {
p.completeWith(Future(message)(ec))
}
}, unit.toMillis(duration))
p.future
}
}
này sau đó có thể được sử dụng như sau:
val future3 = Promise.timeout(3, 10000) // will complete after 10 seconds
thông báo này là đẹp hơn nhiều so với cách cắm một Thread.sleep(10000)
vào mã của bạn, mà sẽ chặn luồng của bạn và buộc chuyển đổi ngữ cảnh.
Cũng đáng chú ý trong ví dụ này là val p = Promise...
ở đầu của hàm và số p.future
ở cuối. Đây là một mô hình phổ biến khi làm việc với lời hứa. Mang nó đến có nghĩa là chức năng này làm cho một số lời hứa cho khách hàng, và bắt đầu một tính toán không đồng bộ để thực hiện nó.
Hãy xem here để biết thêm thông tin về lời hứa của Scala. Lưu ý rằng họ sử dụng phương thức future
chữ thường từ đối tượng gói concurrent
thay vì Future.apply
. Các cựu đại biểu chỉ đơn giản là đại biểu sau này. Cá nhân, tôi thích chữ thường future
.
Nếu bạn muốn kiểm soát trực tiếp khi một tương lai sẽ được hoàn thành, bạn nên sử dụng Lời hứa. –
Các lời hứa có một chút khác biệt - về cơ bản chúng là một 'Tương lai' như được thấy từ khung nhìn của người thi hành (tức là một thùng chứa ghi một lần mà nó phải chèn một giá trị vào một thời điểm nào đó). Người gọi/khách hàng không có cách nào để trực tiếp sử dụng 'Lời hứa' để kiểm soát lịch biểu. –