2010-02-21 28 views
6

Chương trình này, sau khi thực hiện lệnh main(), không thoát.Tôi làm cách nào để thêm diễn viên scala vào chương trình hiện tại mà không can thiệp vào hành vi chấm dứt thông thường?

object Main 
{ 
    def main(args: Array[String]) { 
     ... // existing code 
     f() 
     ... // existing code 
    } 
    def f() { 
     import scala.actors.Actor._ 
     val a = actor { 
      loop { 
       react { 
       case msg: String => System.out.println(msg) 
       } 
      } 
     } 
     a ! "hello world" 
    } 
} 

Do tác dụng phụ không mong muốn này, việc sử dụng diễn viên có thể được xem là xâm nhập.

Giả sử các diễn viên phải tiếp tục chạy cho đến khi chấm dứt chương trình, bạn sẽ làm thế nào để bảo toàn hành vi gốc trong mọi trường hợp chấm dứt?

Trả lời

7

Trong phiên bản 2.8 có lớp DaemonActor cho phép điều này. Trong 2.7.x, bạn có thể hack trong một Scheduler tùy biến mà không ngăn chặn tắt máy ngay cả khi vẫn còn các diễn viên sống, hoặc nếu bạn muốn một cách dễ dàng, bạn có thể gọi System.exit() ở cuối của chính.

Nếu bạn nghĩ về một diễn viên như là một chủ đề trọng lượng nhẹ, phần lớn thời gian bạn muốn một diễn viên trực tiếp ngăn chặn chương trình chấm dứt. Nếu không, nếu bạn có một chương trình thực hiện tất cả các công việc của nó trong các diễn viên, bạn cần phải có một cái gì đó trên chủ đề chính chỉ để giữ cho nó sống cho đến khi tất cả các diễn viên kết thúc.

+0

Cảm ơn. Tôi sẽ thử 2.8 beta –

4

Sau khi chuỗi chính trong ví dụ trên hoàn thành, chương trình vẫn có một chuỗi không phải daemon chạy tác nhân. Nó thường là một ý tưởng tồi để chấm dứt các chủ đề đang chạy bằng cách sử dụng Thread.destroy() hoặc System.exit() cho kết quả có thể rất xấu cho chương trình của bạn bao gồm, nhưng không giới hạn, tham nhũng dữ liệu và deadlocks. Đó là lý do tại sao Thread.destroy() và các phương thức giống nhau không được chấp nhận trong Java cho vị trí đầu tiên. Đúng cách sẽ được thực hiện một cách rõ ràng logic chấm dứt trong chủ đề của bạn. Trong trường hợp diễn viên Scala có thể gửi tin nhắn Stop đến tất cả các diễn viên đang chạy và khiến họ bỏ cuộc khi họ nhận được nó. Với cách tiếp cận này, đường dẫn của bạn sẽ trông như sau:

object Main 
{ 
    case object Stop 
    def main(args: Array[String]) { 
     ... // existing code 
     val a = f() 
     a ! "hello world" 
     ... // existing code 
     a ! Stop 
    } 
    def f() = { 
     import scala.actors.Actor._ 
     actor { 
      loop { 
       react { 
        case msg: String => System.out.println(msg) 
        case Stop => exit() 
       } 
      } 
     } 
    } 
} 
+0

Than ôi, quản lý tuổi thọ diễn viên theo cách thủ công là những gì tôi muốn tránh ... Nó xâm nhập, vì tôi phải thay đổi main(). –

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