2011-08-28 37 views
9

Tôi hiện đang suy nghĩ về cách thiết kế một hệ thống đa luồng trong Java mà cần phải thực hiện một số xử lý mạng và lưu trữ cơ sở dữ liệu nặng. Chương trình sẽ khởi chạy ba luồng cơ bản lúc đầu. Cùng với các chủ đề cơ bản này, tôi muốn khởi chạy các luồng khác không phải từ chương trình chính mà là từ hai luồng. Có thể cho một chuỗi để khởi chạy một chuỗi khác dẫn đến một số loại phân cấp như:Chủ đề trong các chủ đề trong Java?

> Parent ->t0 thread1 -> t1 tread1.1 
>  ->t0 thread2 
>  ->t0 thread3 -> t2 thread3.1 

t0= inital time 
t1,t2 = time at a point in the running thread 
t1 != t2 

Nếu không ai đó có thể cung cấp giải pháp lý thuyết với tham chiếu?

+1

Erm, vâng. Tại sao bạn không thể? Có lẽ nếu bạn đã thử nó ... –

+0

Tôi không chắc chắn những gì bạn đang yêu cầu. Bạn có thể tạo một chủ đề mới từ bất kỳ mã java nào, bất kể chuỗi nó đang chạy. Các luồng có cần giữ tham chiếu tới các luồng khác mà chúng sinh ra không? Mục đích của cấu trúc phân cấp mà bạn mô tả là gì? – Russell

Trả lời

8

Có, bạn có thể khởi chạy nhiều chuỗi tùy thích, nhưng đó có lẽ không phải là cách tốt nhất để thực hiện. Bạn nên sử dụng API không chặn để bạn có thể bắt đầu thực hiện một số cuộc gọi bên ngoài và chuỗi cuộc gọi có thể ngay lập tức bắt đầu thực hiện một việc khác mà không phải chờ cuộc gọi socket/cơ sở dữ liệu quay lại. Sau đó, khi cuộc gọi socket/database quay trở lại, một cuộc gọi lại được kích hoạt để kết thúc quá trình xử lý đó.

I/O không chặn có thể cung cấp khả năng sử dụng CPU cao hơn vì bạn chỉ kích hoạt cuộc gọi và đăng ký cuộc gọi lại và không phải cố gắng cân bằng số lượng "chủ đề" đồng thời.

http://www.owlmountain.com/tutorials/NonBlockingIo.htm

http://www.tensegrity.hellblazer.com/2008/03/non-blocking-jdbc-non-blocking-servlet-apis-and-other-high-mysteries.html

+0

Bạn có biết làm thế nào tôi có thể làm cho thread của tôi tiếp tục chạy bất kể ngoại lệ. Trường hợp ngoại lệ dường như dừng đề (Im cathing). Tôi đã cố gắng giải quyết nó bằng cách tạo một thread bên trong một thread nhưng ngoại lệ trong Thread B (được tạo từ bên trong luồng A) dừng cả hai luồng. Các cờ boolean cho cả hai đều đúng sau khi chúng đã dừng lại. – Lealo

2

Có một sợi có thể khởi chạy thread khác, và chủ đề đó có thể khởi chạy ren (s) và cứ tiếp tục ...

Trong phương pháp run() của a thread - bạn có thể tạo và bắt đầu chủ đề khác.

3

Để trả lời câu hỏi, có chủ đề có thể khởi động đề khác.

Hệ thống phân cấp có quan trọng không?

Có lẽ bạn nên sử dụng số ExecutorService với nhóm chủ đề được lưu trong bộ nhớ cache. Bằng cách đó bạn có thể bơi chủ đề thay vì tạo ra rất nhiều (mà là tốn kém). ExecutorServices cũng cung cấp những thứ thú vị khác, và sử dụng Callables/Runnables với chúng có lẽ dễ dàng hơn nhiều để kiểm tra hơn là mucking về với các chủ đề của riêng bạn.

0

Có thể cho dụ bạn có thể tạo chủ đề và đưa id trong mảng như thế này

UnThread[] tab= new UnThread[10] ; 

for (int i=0;i<20;i++) 

tab[i] = new UnThread(); 

Sau khi bạn có thể cung cấp cho subMainThread mảng tab

dụ

while(tab[1].isAlive()) { 
    //do somthing.. 
    System.out.println("Ligne affichée par le main"); 
    try { 
    // et faire une pause 
    tab[1].sleep(800); 
    } 
    catch (InterruptedException ex) {} 
} 

đây một cách sử dụng đơn giản của luồng: http://kamel.berrayah.com/wordpress/2013/07/java-threads/