2011-11-04 34 views
7

Tại sao đoạn mã sau tạo một bế tắc:Scala bế tắc với bộ sưu tập song song

object Test extends Application 
{ 
    def printProgress(i:Int) = 
    { 
    println("Processed " + i) 
    } 

    println("A") 
    (1 to 1000).par.foreach{ i => 
    printProgress(i) 
    } 
    println("B") 
} 

(tức là A được in, nhưng không phải B hay bất kỳ Processed ... dòng được in.)

Tuy nhiên sau mã không gây ra bế tắc:

object Test extends Application 
{ 
    println("A") 
    (1 to 1000).par.foreach{ i => 
    println("Processed " + i) 
    } 
    println("B") 
} 

(nghĩa là mọi thứ được in.)

Tôi đang chạy phiên bản Scala 2.9.1.final.

+1

'cảnh báo: có 1 cảnh báo không dùng nữa là một gợi ý rằng mọi thứ không hoàn toàn đúng :-) – leedm777

Trả lời

13

Có lẽ vì bạn mở rộng Ứng dụng, trong khi tôi không thể nói điều gì tạo nên sự khác biệt giữa hai ví dụ của bạn.

Với ứng dụng, mã được thực thi bên ngoài phương thức main, trong quá trình khởi tạo lớp. JVM bị hạn chế nghiêm trọng vào thời điểm này, đáng chú ý là liên quan đến đa luồng. Ứng dụng không được chấp thuận có lợi cho Ứng dụng, trong đó có một số phép thuật (đặc điểm DelayedInit) khiến mã được thực hiện trong main. Vì vậy, object Test extends App nên sửa chữa nó.

+0

Đó là câu trả lời kỳ diệu, tôi sẽ ghi nhớ điều này liên quan đến công việc tương lai của riêng tôi. XD – Xorlev

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