2013-08-14 36 views
11

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?

+1

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

+0

Bạn không thể khởi động lại một chuỗi! –

+6

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. –

Trả lời

40

Thread lifecycle image

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.

+6

Bạn có thể cung cấp nguồn gốc của hình ảnh này không? – Uooo

+3

+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 –

10

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

2

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).

enter image description here

Read more Từ Here về vòng đời của Chủ đề.

7

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

4

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ó.

2

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.

enter image description here

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.

3

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.

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