2010-03-22 52 views
5

Làm thế nào để tiêu diệt luồng? ..... Cách khởi động lại chúng trong đa luồng?Giới thiệu về đa luồng

+0

Có Thread.stop(): http://java.sun.com/javase/6/docs/api/java/lang/Thread. html # stop(), nhưng bạn không nên làm điều đó: http://java.sun.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html –

+1

Trang thực sự giải thích sự nguy hiểm của nguyên thủy chủ đề là http://java.sun.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html – Will

+0

@chetans, bạn nên viết lại cái này để nó cụ thể hơn và có ý nghĩa hơn. – avpx

Trả lời

2

tôi kết nối chuỗi công việc của mình lên trong lớp của riêng họ và sử dụng thuộc tính đã kết thúc để giết vòng lặp proc luồng.

xin lỗi tôi không có một phiên bản java để bàn ngay bây giờ nhưng bạn sẽ nhận được các ý tưởng từ này http://pastie.org/880516

using System.Threading; 

namespace LoaderDemo 
{ 
    class ParserThread 
    { 
     private bool m_Terminated; 
     private AutoResetEvent m_Signal; 
     private string m_FilePath; 
     ... 

     public ParserThread(AutoResetEvent signal, string filePath) 
     { 
      m_Signal = signal; 
      m_FilePath = filePath; 

      Thread thrd = new Thread(this.ThreadProc); 
      thrd.Start(); 
     } 

     public bool Terminated { 
      set { m_Terminated = value; } 
     } 

     private Guid Parse(ref string s) 
     { 
      //parse the string s and return a populated Guid object 
      Guid g = new Guid(); 

      // do stuff... 

      return g; 
     } 

     private void ThreadProc() 
     { 
      TextReader tr = null; 
      string line = null; 
      int lines = 0; 

      try 
      { 
       tr = new StreamReader(m_FilePath); 
       while ((line = tr.ReadLine()) != null) 
       { 
        if (m_Terminated) break; 

        Guid g = Parse(ref line); 
        m_GuidList.Add(g); 
        lines++; 
       } 

       m_Signal.Set(); //signal done 

      } 
      finally 
      { 
       tr.Close(); 
      } 

     } 

    } 
} 
3

Thread.stop() giết một chuỗi, nhưng bạn chắc chắn không muốn thực hiện việc này (xem tài liệu API để biết giải thích tại sao). Thread.interrupt() gửi thông báo không đồng bộ đến một chuỗi, để nó có thể tự đóng một cách duyên dáng.

Để có văn bản toàn diện về đa luồng Java, tôi khuyên bạn nên B. Goetz, Đồng thời Java trong Thực tiễn, Addison-Wesley Professional.

+5

Thread.stop() giống như đặt một chiếc xe hơi đi 60mph trong công viên để dừng nó ... chắc chắn dừng lại, nhưng bạn sẽ để lại một đường mòn buồn, buồn của kim loại xoắn trên đường đi và chiếc xe của bạn sẽ không bao giờ khá giống nhau ;-) –

+0

cũng, Thread.interrupt wont luôn luôn làm gián đoạn một thread chờ đợi trên IO. nếu bạn nghiêm túc về thiết kế cho gián đoạn bạn cần một cách để buộc đóng bất kỳ luồng IO nào mà luồng mục tiêu của bạn có thể đang chờ trên – radai

1

Cách tốt nhất để xóa chuỗi là thiết lập cờ cho chuỗi để xem. Lập trình chuỗi để thoát khi thấy cờ được đặt thành đúng. Không có cách nào để khởi động lại một chuỗi bị giết.

+0

.... nhưng bạn có thể lưu bản thân chạy sau này để sử dụng sau – radai

+2

Cách tốt nhất để hủy chỉ là gọi Thread.interrupt() và có thread cũng theo dõi trạng thái ngắt của nó theo định kỳ. Việc thêm một boolean khác là hoàn toàn dư thừa. – EJP

+0

Ngoài những gì EJP đã nói, cờ được cuộn bằng tay không hoạt động tốt với các nhà thi hành. –

4

Vì bài đăng của bạn được gắn thẻ "Java", tôi có ý tưởng hay về những gì bạn đang nói. Hãy nói rằng bạn bắt đầu một chủ đề bằng cách thực hiện:

Thread foo = new Thread(someRunnable); 
foo.start(); 

Bây giờ destroy và bạn bè đang bị phản đối, bạn cần một cách để diệt các sợi. May mắn cho bạn, luôn có khái niệm "gián đoạn". Đơn giản chỉ cần thay đổi runnable của bạn để, trên ngắt, nó thoát. Sau đó, gọi phương thức interrupt của luồng.

foo.interrupt(); 

Nếu bạn đã viết Runnable của bạn để xử lý chính xác, nó sẽ dừng mọi việc đang làm và chấm dứt.

1

Nếu bạn muốn bắt đầu, dừng lại, khởi động lại chủ đề theo ý muốn, có thể sử dụng Java 5 gói đồng thời sẽ là một ý tưởng tốt. Bạn có thể có một Executor mà sẽ làm một chút công việc, và khi bạn cần một chút công việc phải được thực hiện lại, bạn chỉ có thể lên lịch lại nó được thực hiện trong trình thực thi.

3

Cách thuận lợi nhất để một Thread chết là để thực hiện phương pháp run đi đến kết thúc:

Thread t = new Thread(new Runnable() { 
    public void run() { 
    // Do something... 

    // Thread will end gracefully here. 
    } 
} 

Khi một sợi duyên dáng chết trong ví dụ trên, các Thread không thể được khởi động lại. (Cố gắng gọi Thread.start trên một chủ đề đã được bắt đầu sẽ gây ra một IllegalThreadStateException.)

Trong trường hợp đó, người ta có thể tạo một thể hiện khác của chủ đề và gọi start trên đó.

Có lẽ một nơi tốt để có thêm thông tin về luồng sẽ là Lesson: Concurrency từ The Java Tutorials.

0

Về truy vấn đầu tiên của bạn trên giết chủ đề:

Bạn có thể tìm thêm thông tin chi tiết về chủ đề ở bên dưới câu hỏi SE:

How to properly stop the Thread in Java?

How can I kill a thread? without using stop();

How to start/stop/restart a thread in Java?

Về thứ hai của bạn truy vấn của thread bắt đầu lại, nó không thể trong java.

Bạn có thể tìm thấy bên dưới thông tin chi tiết trong tài liệu page

void start công cộng()

Nguyên nhân chủ đề này để bắt đầu thực hiện; Máy ảo Java gọi phương thức chạy của luồng này.

Kết quả là hai luồng đang chạy đồng thời: luồng hiện tại (trả về từ cuộc gọi đến phương thức bắt đầu) và luồng khác (thực thi phương thức chạy của nó).

Không bao giờ là hợp pháp để bắt đầu một chuỗi nhiều lần. Đặc biệt, một luồng có thể không được khởi động lại khi nó đã hoàn thành việc thực thi.

Thay vì Chủ đề đơn giản, bạn có thể sử dụng API đồng thời nâng cao để quản lý vòng đời chuỗi. Có một cái nhìn vào bài đăng này để biết chi tiết ExecutorService:

How to properly use Java Executor?

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