2010-01-05 28 views
25

Tôi muốn tạo quy trình trong ứng dụng của mình. Nhưng sau khi nhìn xung quanh và từ API của Java, tôi vẫn không nhận được nó.Cách tạo quy trình trong Java

Về cơ bản tôi muốn tạo một ứng dụng đa quy trình. Nhưng quy trình mới là một lớp trong ứng dụng của tôi.

Tôi biết một số bạn có thể hỏi tại sao không tạo chuỗi? Vì lớp đang gọi mã MATLAB, sự cố và lớp Java là Here

Có bất kỳ ví dụ hoặc hướng dẫn mã nào mà bạn có thể đề xuất không? Cảm ơn.

+2

Lưu ý rằng câu trả lời bạn đã liên kết không * không * nói rằng bạn cần một quy trình riêng biệt. Bạn có thể sử dụng một thread, bạn chỉ cần chắc chắn rằng bạn chỉ sử dụng MATLAB từ một thread. – sleske

+0

Vâng, nó không làm việc cho tôi. Bạn đã đọc liên kết tôi đã đăng trên chủ đề đó chưa? Từ những gì tôi giải thích từ bài báo, tôi thực sự cần một quy trình. Trừ khi bạn có thể chỉ cho tôi đi đúng hướng. –

Trả lời

15

Chỉ có một cách để tạo quy trình trong Java, Runtime.exec() - về cơ bản nó cho phép bạn bắt đầu một JVM mới giống như bạn thực hiện thông qua giao diện dòng lệnh.

+0

Vì vậy, điều này có nghĩa là tôi cần phải biên dịch mã dưới dạng một ứng dụng riêng biệt và gọi nó? –

+6

Nó cho phép bạn bắt đầu bất kỳ quá trình hệ thống nào, không chỉ là một JVM mới, trừ khi đó là quy trình mới mà bạn muốn bắt đầu. – Dave

+0

@Dave: Vâng, tất nhiên rồi. –

23

lẽ java.lang.Process có thể giúp ở đây ..

Các ProcessBuilder.start()Runtime.exec phương pháp tạo ra một quá trình tự nhiên và trở về một thể hiện của một lớp con của Process có thể được sử dụng để kiểm soát quá trình này và có được thông tin về nó. Quy trình lớp cung cấp các phương thức để thực hiện đầu vào từ quá trình, thực hiện đầu ra cho quá trình, chờ quá trình hoàn thành, kiểm tra trạng thái thoát của tiến trình và hủy (quá trình) hủy.

+0

Câu hỏi của ông không phải về java.lang.Process nhưng cách viết một ứng dụng có thể sao chép chính nó. –

+6

@Aaron: Điều gì khiến bạn tin rằng người đăng muốn ứng dụng "nhân bản bản thân"? Và điều đó có nghĩa là gì? Một cái gì đó giống như fork() trong Unix? – sleske

+0

@sleske: Aaron gần như đúng, tôi muốn chạy một lớp trong mã của tôi như là một quá trình trong khi phần còn lại của các lớp như một quá trình khác. Trong một số ý nghĩa ngã ba của nó(). –

4

Tôi đoán bạn biết cách tạo quy trình mới. Nếu không, hãy xem here hoặc here.

Bây giờ bạn cần chạy java.exe với đường dẫn lớp hiện tại của bạn. Bạn có thể tìm thấy classpath này trong thuộc tính System java.class.path. Để tìm số java.exe, hãy xem new File(System.getProperty("java.home"), "bin").

Nếu bạn có vấn đề với cách tiếp cận này, tôi đề nghị viết một kịch bản trình bao bọc và gọi nó với đủ đối số để mã trong main() có thể quyết định lớp thực tế cần gọi.

+0

Thuộc tính hệ thống java.class.path không chứa java.exe, có thể bạn có nghĩa là java.home/bin. –

+0

@ AndreasÅgren: Văn bản chính xác nhưng khó hiểu. Cải thiện nó. –

+0

Ok, có vẻ tốt. –

6

Nếu bạn muốn biết thêm kiểm soát hạt mịn, bạn có thể sử dụng ProcessBuilder - lớp này cho phép bạn thiết lập các biến môi trường và cấu hình ống của dự án (stdout, in, err).

Khi bạn đã định cấu hình, bạn có thể gọi ProcessBuilder#start() bao nhiêu lần tùy ý để tạo quy trình mới (nó trả về phiên bản Process). Bạn có thể thay đổi cấu hình cho các quy trình mới giữa các cuộc gọi này thành start().

0

Tôi đề nghị là để có một cái nhìn tại ZT-exec: https://github.com/zeroturnaround/zt-exec

Nó quấn java.lang.ProcessBuilder và và Apache Commons Exec, và có thể quản lý vòng đời quá trình một cách dễ dàng.

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