2012-04-10 40 views
10

Mỗi lần tôi phải tạo một số lượng biến chủ đề. Tôi thực hiện việc này bằng cách tạo một chuỗi Chủ đề và tạo nhiều chuỗi chủ đề.Tạo số lượng chủ đề động đồng thời

Nhưng, tôi không hiểu cách bắt đầu các số lượng chuỗi chủ đề này hoạt động như khái niệm đa luồng. Tôi muốn chúng chạy song song.

Vui lòng hướng dẫn xem phải làm gì trong senario này.

+0

Hãy chắc chắn chấp nhận câu trả lời của tôi nếu nó hữu ích. – Gray

Trả lời

2

psuedocode cơ bản:

create x threads, store them in an array or list; 
for each thread in the list/array 
    call start() on the thread object; 
+0

Nếu tôi làm như vậy, các luồng không chạy song song. Nhưng, họ đang chạy tuần tự như một chức năng bình thường gọi – sowmya

+0

@ sowmya Tôi nghĩ rằng bạn cần phải đọc lên trên chủ đề. Gọi start() trên một loạt các chuỗi liên tiếp không có nghĩa là chúng chạy tuần tự, nó chỉ có nghĩa là chúng được bắt đầu tuần tự. –

+0

Nhưng, chúng đang thực hiện chức năng tuần tự theo thứ tự mà tôi bắt đầu chúng. Theo kiến ​​thức của tôi, ít nhất là đầu ra nên thay đổi. Nhưng, nó không xảy ra. Đúng nếu tôi đã sai lầm. – sowmya

33

Nhưng, tôi không hiểu làm thế nào để bắt đầu các số n của chủ đề hành xử giống như khái niệm đa luồng. Tôi muốn họ chạy song song.

Bạn chắc chắn có thể tạo ra một loạt các chủ đề sử dụng một vòng lặp:

Thread[] threads = new Thread[NUM_JOBS_TO_CREATE]; 
for (int i = 0; i < threads.length; i++) { 
    threads[i] = new Thread(new Runnable() { 
     public void run() { 
      // some code to run in parallel 
      // this could also be another class that implements Runnable 
     } 
    }); 
    threads[i].start(); 
} 

Điều này sẽ gây ra các chủ đề để chạy trong nền song song. Sau đó, bạn có thể tham gia với họ sau đó để chờ tất cả họ hoàn thành trước khi tiếp tục.

// wait for the threads running in the background to finish 
for (Thread thread : threads) { 
    thread.join(); 
} 

Nhưng thay vì tự quản lý chủ đề, tôi khuyên bạn nên sử dụng tên dựng sẵn Java Executors. Họ làm tất cả điều này cho bạn được dễ dàng hơn để quản lý. Một trong những lợi ích của phương pháp này là nó phân tách các nhiệm vụ từ các chủ đề chạy chúng. Bạn có thể bắt đầu, ví dụ, 10 chủ đề để chạy 1000 và 1000 nhiệm vụ song song.

Dưới đây là một số mẫu ExecutorService mã:

// create a pool of threads, 10 max jobs will execute in parallel 
ExecutorService threadPool = Executors.newFixedThreadPool(10); 
// submit jobs to be executing by the pool 
for (int i = 0; i < NUM_JOBS_TO_CREATE; i++) { 
    threadPool.submit(new Runnable() { 
     public void run() { 
      // some code to run in parallel 
      // this could also be another class that implements Runnable 
     } 
    }); 
} 
// once you've submitted your last job to the service it should be shut down 
threadPool.shutdown(); 
// wait for the threads to finish if necessary 
threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS); 

Mọi chi tiết, xem các Java tutorial on the thread executors.

+0

nếu tôi có 1000 công việc, nó sẽ tạo ra 1000 đối tượng sẽ dẫn đến một vấn đề hiệu suất –

+0

1000 đối tượng là khá rẻ @ManojRamanan. 1000 chuỗi đắt hơn từ góc độ băng thông đối tượng. Bạn có thể nhận thấy một số vấn đề GC nếu bạn tạo ra một triệu đối tượng vì vậy chúng tôi thường đặt các ranh giới trên hàng đợi trong trường hợp nhà sản xuất 'Runnable' nhanh hơn nhiều so với người tiêu dùng. – Gray

+0

Cảm ơn, @Gray cho information.can bạn pls chia sẻ thêm một số thông tin tôi hiện đang sử dụng implementation.how này làm bạn kiểm tra nó –

2

Cố gắng hết sức để không tạo các chuỗi chủ đề và cố gắng quản lý chúng - nó sẽ sớm biến thành một mớ hỗn độn. Nếu bạn cần một nhóm các chủ đề để chạy các nhiệm vụ, bạn cần một hàng đợi của người sản xuất-người tiêu dùng. Tạo một và vượt qua nó, (hoặc thể hiện đối tượng threadpool có chứa nó như là một thành viên), vào các chủ đề khi bạn tạo chúng. Vòng lặp luồng, tìm nạp các nhiệm vụ và thực thi chúng.

Cách dễ dàng để thực hiện việc này là sử dụng ExecutorService được chi tiết bởi @Gray, (+1). Để nhấn mạnh, tôi nói một lần nữa, đừng cố quản lý vi mô trong các mảng, danh sách hoặc vectơ, bắt đầu chúng, kiểm tra trạng thái của chúng trong vòng lặp 'sếp/quản lý', chấm dứt/hủy bỏ chúng, phá hủy chúng, v.v. vv Nó giống như chiếc Porsche 911 - sau khi tiêu tốn một lượng lớn tiền/thời gian để có được một chiếc, bạn sẽ có thứ gì đó có vẻ ổn và sau đó nó đột nhiên sẽ vỡ và biến bạn thành một cái cây.

Sử dụng một chuỗi chuyên dụng cho các công việc chặn trong thời gian dài, một luồng cho những người có thể được thực hiện một cách nhanh chóng và nhanh chóng.

+0

Cảm ơn Martin !!! Nó hoạt động ... Tôi đã theo dõi khái niệm ExecutoeService. – sowmya

0

Trong một lớp học mà cần phải được đa luồng tôi đặt ở phía trên cùng của lớp:

private static final ExecutorService executor = Executors.newCachedThreadPool();

& trong Java 8 + sử dụng một biểu lamda bất cứ nơi nào tôi cần một cái gì đó để chạy trong một chủ đề mới:

executor.submit(() -> { 
     myOtherClass.myFunction(doSomething); 
}); 

với Java newCachedThreadPool sẽ quản lý tổng số đề theo số lượng lõi CPU trên hệ thống & tự động ngăn chặn chúng sau một thời gian ina ctivity (60 giây theo mặc định).

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