2012-10-21 35 views
5

thể trùng lặp:
How do you kill a thread in Java?
How to start/stop/restart a thread in Java?Làm thế nào để dừng một chuỗi Java?

Thread có các chức năng sau:

  • destroy()
  • stop()
  • suspend()

nhưng tất cả chúng đều phản đối.
Bạn sử dụng cái gì để ngăn chặn một chuỗi?

+0

Bạn không dừng chuỗi, chỉ cần thực hiện phương thức 'chạy' kết thúc quá trình thực hiện. –

+0

Bạn có thể giải thích về trường hợp sử dụng của bạn về lý do tại sao bạn muốn ngăn chặn một chủ đề? – Vikdor

+0

Để hoàn thành, cách khác là chấm dứt toàn bộ quá trình - điều đó sẽ hoạt động. –

Trả lời

4

Bạn nên đảm bảo rằng nó chỉ chạy qua/thoát chính nó khi được yêu cầu.

Kiểm tra this để được giải thích.

3

Bạn có thể sử dụng cờ boolean để dừng chuỗi. Ngoài ra, bạn có thể sử dụng Thread.isInterrupted() để kiểm tra xem chuỗi có bị gián đoạn hay không và bỏ qua phần còn lại của tác phẩm giống như cờ boolean.

class Worker implements Runnable { 
    private volatile boolean shouldRun = true; 

    @Override 
    public void run() { 
     while (shouldRun) { 
      // your code here 
     } 
    } 

    public void cancel() 
    { 
     shouldRun = false; 
    } 
} 

Nếu bạn wan để biết lý do tại sao các chức năng này đang bị phản đối, bạn có thể kiểm tra Java Thread Primitive Deprecation

2

Bạn có thể làm điều đó như thế này:

private boolean running = true; 

public void stop() { 
    running = false; 
}  

public void run() { 
    while (running) { 
     //your code goes here 
    } 
} 

Đây chỉ là một cách đơn giản để cho các run- phương pháp đơn giản là chết.

+1

+1 chạy cần phải được 'bay hơi 'nếu không chạy() có thể không bao giờ dừng lại. –

2

Bạn yêu cầu anh ta lịch sự để kết thúc công việc của mình. Các chủ đề nên được cư xử tốt và nó sẽ kết thúc nó làm việc khi được hỏi.

Để yêu cầu bạn sử dụng Thread.interrupt(), hoặc sẽ ném vào InterruptedException (nếu chuỗi đang chờ) hoặc đặt cờ trong chuỗi (nếu không đợi).

Sau đó, chủ đề sẽ thoát khi nó bắt được InterruptException hoặc nếu nó hoạt động lâu dài (không ngủ/chờ) thì thỉnh thoảng nên kiểm tra nếu nó bị gián đoạn và thoát ra nếu có.

0

Các phương pháp bạn đề cập không được chấp nhận vì một khi được sử dụng, chúng có thể mang hệ thống đến trạng thái không ổn định: nó giống như quá trình giết. Sử dụng các phương pháp này không cung cấp cho thread bất kỳ cơ hội để thoát ra một cách duyên dáng.

Kết luận là mỗi chuỗi bạn đang triển khai phải có cơ chế riêng để thoát ra duyên dáng. Thông thường bạn làm như sau. Tạo boolean cờ exit theo mặc định là false. phương pháp của chủ đề run() nên thực hiện vòng lặp như:

while (!exit) { 
    // do the job 
} 

Add phương pháp exit() có thể biến cờ này để true, vì vậy khi phương pháp này được gọi từ bên ngoài chủ đề của bạn sẽ rời khỏi while vòng lặp ở phiên bản kế tiếp.Bạn nên quan tâm đến việc đóng tài nguyên vv khi thoát.

Rõ ràng bạn có thể cải thiện cơ chế bằng cách gửi bài hát

0

Bất kỳ chuỗi nào chạy để thực hiện công việc của nó. Nó sẽ tự xác định nếu có nhiều việc phải làm. Khi bạn muốn dừng một thread đang hoạt động, điều này có nghĩa là thread nghĩ rằng công việc tồn tại, nhưng bạn không muốn thread làm điều đó. Điều này chắc chắn là một vấn đề trong thiết kế của bạn. Trong một vấn đề được thiết kế tốt, không cần dừng/tiếp tục luồng.

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