Tất cả các khả năng khác nhau là gì để mang lại chủ đề đã chết quay lại trạng thái runnable .Làm cách nào để khởi động lại chuỗi chết?
Trả lời
Nếu bạn nhìn vào các Chủ đề Life Cycle hình ảnh, không có cách nào bạn có thể quay trở lại vị trí mới khi chủ đề của bạn đã chấm dứt.
Vì vậy, không có cách nào để đưa chuỗi chết về trạng thái runnable, thay vào đó bạn nên tạo một thể hiện Thread mới.
Bạn có thể cung cấp nguồn gốc của hình ảnh này không? – Uooo
+1 bài đăng hay. @Uooo Mở [link] này (http://faculty.inverhills.mnscu.edu/speng/cs1127/Notes/Ch23/LifeCycle.htm) và nhấp vào biểu đồ UML –
Từ JavaDocs ...
Nó không bao giờ là pháp lý để bắt đầu một chủ đề nhiều hơn một lần. Cụ thể, một chủ đề có thể không được khởi động lại khi nó đã hoàn thành thực thi.
Bạn sẽ phải bắt đầu một phiên bản hoàn toàn mới.
Tốt, hành động mà bạn muốn thực hiện nên được bọc trong một giao diện Runnable
, như vậy bạn có thể chỉ cần vượt qua Runnable
đến một trường hợp mới của Thread
Khi thực hiện chạy() phương pháp kết thúc, như công việc nó có nghĩa là được thực hiện, nó được đưa đến trạng thái chết. Nó được thực hiện hoàn toàn bởi JVM. Trong trạng thái chết, đối tượng luồng là rác được thu thập. Nó là kết thúc của vòng đời của sợi. Sau khi xóa một chủ đề, nó không thể khởi động lại được nữa (vì đối tượng chuỗi không tồn tại).
Read more Từ Here về vòng đời của Chủ đề.
Tôi đoán bạn đã mở rộng lớp Thread
và bạn đã ghi đè phương thức run
. Nếu bạn làm điều này bạn đang buộc mã runnable vào vòng đời của Thread
. Vì không thể khởi động lại Thread
, bạn phải tạo một Thread
mới mọi lúc. Một thực hành tốt hơn là tách mã để chạy trong một luồng từ vòng đời của Thread
bằng cách sử dụng giao diện Runnable
.
Chỉ cần trích xuất phương thức run
trong lớp thực hiện Runnable
. Sau đó, bạn có thể dễ dàng khởi động lại nó.
Ví dụ:
public class SomeRunnable implements Runnable {
public void run(){
... your code here
}
}
SomeRunnable someRunnable = new SomeRunnable();
Thread thread = new Thread(someRunnable);
thread.start();
thread.join(); // wait for run to end
// restart the runnable
thread = new Thread(someRunnable);
thread.start();
thực tế này làm cho nó cũng dễ dàng nếu bạn cần phải nhớ tình trạng chạy trước.
public class SomeRunnable implements Runnable {
private int runs = 0;
public void run(){
runs++;
System.out.println("Run " + runs + " started");
}
}
PS: Sử dụng java.util.concurrent.Executor
để thực thi Runnable
s. Điều này sẽ tách rời việc quản lý luồng khỏi thực thi.
Executor executor = Executors.newSingleThreadExecutor();
...
SomeRunnable someRunnable = new SomeRunnable();
executor.execute(someRunnable);
Hãy xem Executor Interfaces
Sợi chỉ là một quá trình trọng lượng nhẹ riêng biệt mà thực hiện một cách độc lập không phụ thuộc vào các chủ đề khác. Sau khi thực hiện xong, không tồn tại phương tiện nào để khởi động lại nó.
Chủ đề có nhiều trạng thái khác nhau trong suốt cuộc đời của nó.
1 trẻ sơ sinh State
2 Nhà nước Runnable
3 Trạng thái hoạt động
4 Blocked Nhà nước
5 Chết Nhà nước
Chủ đề nên trong bất kỳ một tình trạng trên và nó có thể di chuyển từ trạng thái này sang trạng thái khác bằng các phương thức và cách khác nhau.
Khi một thread được hoàn thành thực hiện phương pháp của nó run() vòng đời của rằng chủ đề cụ thể là kết thúc.
Chúng ta có thể hủy luồng bằng cách gọi phương thức stop() cho luồng cụ thể đó và gửi nó ở trạng thái chết.
Giải pháp rõ ràng khác là: nếu bạn cần chức năng của chuỗi nhiều lần, đừng để cho chuỗi bị chết. Thay vì để cho nó thoát ra, và do đó chấm dứt chính nó, xô trong một thời gian (true) vòng lặp với một chờ đợi thích hợp ở đầu trang. Sau đó bạn có thể làm cho nó 'khởi động lại' công việc của nó bằng cách báo hiệu nó.
Điều này nhanh hơn, an toàn hơn và hiệu quả hơn liên tục tạo/chấm dứt/hủy chuỗi.
- 1. Làm cách nào để đặt lại trang Khởi động ASP.NET?
- 2. Làm cách nào để khởi động lại máy chủ mysql?
- 3. Làm cách nào để khởi động lại git bash?
- 4. Làm cách nào để làm cho chương trình tự khởi động lại? (Quá trình Linux)
- 5. Làm thế nào để làm khởi động lại với Unicorn?
- 6. Làm thế nào để bắt đầu/dừng/khởi động lại một chuỗi trong Java?
- 7. Làm thế nào để khởi động lại từ vỏ tro?
- 8. Làm thế nào để khởi động lại dịch vụ RabbitMQ
- 9. làm thế nào để khởi động lại kho git
- 10. Làm cách nào để khởi động lại/tái sử dụng Tác vụ lặp lại?
- 11. Làm cách nào để khởi động lại hoặc đặt lại các thuộc tính của một lớp?
- 12. Làm cách nào để giữ lại một đối tượng phức tạp trong Hoạt động khởi động lại?
- 13. Cách khởi động lại dịch vụ?
- 14. Khởi động lại khi khởi động/Khởi động lại hành khách
- 15. Khởi động lại Sidekiq
- 16. Làm cách nào để khởi động lại Rails từ trong Rails?
- 17. Làm cách nào để khởi động lại máy chủ NodeJS một cách duyên dáng?
- 18. Cách khởi động lại Celery một cách duyên dáng mà không làm chậm công việc
- 19. Làm cách nào để hủy và khởi động lại đúng quy trình BackgroundWorker?
- 20. Làm cách nào để mở lại các tệp từ xa khi khởi động trong Aptana 3.3.1?
- 21. Làm cách nào để khởi động lại máy chủ PostgreSQL trên MacOS?
- 22. Làm cách nào để khởi động lại trình thông dịch Python được nhúng?
- 23. Làm cách nào để khởi động lại mysql và tệp my.cnf ở đâu
- 24. Làm cách nào để biết máy tính đã được khởi động lại chưa?
- 25. Tự động khởi động lại ứng dụng Erlang
- 26. Làm thế nào để tắt tự động khởi động lại Tomcat trong Eclipse?
- 27. làm thế nào để buộc các hoạt động khởi động lại từ ý định
- 28. Làm thế nào để khởi động lại trình tự PostgreSQL được xử lý bởi Hibernate?
- 29. postgres, ubuntu cách khởi động lại dịch vụ khi khởi động? bị kẹt khi nhóm lại sau khi khởi động lại ví dụ
- 30. PHP chết() trả lại
Không có! Bạn tốt hơn hết là gói trạng thái luồng của bạn trong một đối tượng (có lẽ là một 'Runnable'), và chỉ truyền đối tượng này cho một chủ đề mới. – phs
Bạn không thể khởi động lại một chuỗi! –
Bạn cần sử dụng các kỹ thuật du hành thời gian tiên tiến. Và bạn phải tránh tạo ra nghịch lý ... giống như khi một luồng không hoạt động trở lại và giết chết chuỗi chủ của nó trước khi nó được tạo ra. –