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
Trả lời
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();
}
}
}
}
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.
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 ;-) –
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
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.
.... nhưng bạn có thể lưu bản thân chạy sau này để sử dụng sau – radai
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
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. –
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.
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.
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.
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:
- 1. Giới thiệu về RenderScript
- 2. Giới thiệu về lớp System.Linq.Lookup
- 3. Haskell - Giới thiệu về Curried
- 4. Giới thiệu về "setf" trong "defun"?
- 5. Giới thiệu về lập trình GPU
- 6. Giới thiệu về C# và Thừa kế
- 7. Giới thiệu về đóng cửa python
- 8. Giới thiệu về mã yêu cầu.setTesting (true)
- 9. Giới thiệu về tiểu loại phụ Java
- 10. Giới thiệu về DbSet và DbContext
- 11. Giới thiệu về IO không đồng bộ không phải luồng cho C++?
- 12. Giới thiệu về việc chia nhỏ tệp Hadoop/HDFS
- 13. Kiểm tra giới thiệu
- 14. Giới thiệu tốt về lập trình socket TCP trong Java?
- 15. Giới thiệu về Code First Database Evolution (aka Migrations)
- 16. gặp sự cố khi giới thiệu về d3.js
- 17. Giới thiệu về "NULL" trong mã cụ thể này
- 18. Giới thiệu về điểm vào của PE trong Windows
- 19. Giới thiệu về "getBytes" thực hiện trong BitConverter
- 20. Giới thiệu về dấu hỏi trong cụm từ thông dụng
- 21. Giới thiệu về con trỏ trong Mục tiêu-C
- 22. Giới thiệu về trường "_id" trong Android SQLite
- 23. Giới thiệu về việc nhận đối tượng NSManagedObject mới
- 24. Tìm kiếm một giới thiệu tốt về trie
- 25. Giới thiệu về C# cho người dùng C/C++
- 26. Hướng dẫn và giới thiệu về Mẫu biểu thức C++
- 27. Giới thiệu về hệ thống đại số máy tính?
- 28. Giới thiệu về serialVersionUID được tạo trong Eclipse
- 29. Giới thiệu về sử dụng quad trong MATLAB
- 30. Ví dụ về Hadoop Hello World và Giới thiệu
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 –
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
@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