2012-05-08 23 views
12

Có một cách để chờ đợi vào một AtomicInteger vì vậy mà tôi không cần phải giữ ngủ chủ đề hiện tại của tôi và liên tục kiểm tra trên AtomicInteger như thế nàyCó cách nào để chờ đợi sự thay đổi trên một số nguyên nguyên tử

while(atomicInt.get() >= 0) { 
    Thread.sleep(1000) 
} 

tôi biết có một điều như một CountDownLatch nhưng điều đó chỉ cho phép tôi để giảm giá trị tôi cũng cần nó để có thể tăng

cốt truyện tiếp theo - tôi có một vòng lặp tạo chủ đề và tôi cần phải chờ đợi vào một của các chủ đề thực hiện để kết thúc trước khi tạo một chủ đề mới. Tuy nhiên tôi đang sử dụng Executors.newFixedThreadPool(numThreads) và cách duy nhất để chờ đợi có vẻ như gọi phương thức shutdown đang chờ kết thúc và sau đó tạo một threadPool mới thay vào đó tôi đã sử dụng một số nguyên nguyên để theo dõi số lượng luồng đang chạy và/hoặc trên hàng đợi để khi số đó giảm, tôi có thể tiếp tục với vòng lặp.

+6

Câu trả lời ngắn gọn là không. Bạn có thể chỉnh sửa câu hỏi của mình và giải thích thêm một chút không _why_ bạn muốn điều này? Có thể có các lựa chọn thay thế khác. – Gray

+0

tại sao không sử dụng WaitForSingleObject để chờ. Tạo ra một vòng lặp trong khi chờ đợi là một ý tưởng khủng khiếp. – CyprUS

+4

Chờ đợi trên một đối tượng nguyên tử hoàn toàn đánh bại mục đích của một thuật toán chờ đợi. Bạn đang làm sai. – maerics

Trả lời

2

Tôi nghĩ điều bạn thực sự muốn là xử lý một số sự kiện. Sự kiện đó có thể lần lượt tăng một số nguyên. Xem nhanh BlockingQueue.

Hàng đợi hỗ trợ thêm các hoạt động chờ hàng đợi trở thành không trống khi truy xuất phần tử và đợi khoảng trống có sẵn trong hàng đợi khi lưu trữ phần tử.

Mã này có thể trông giống như ...

MyEvent incrementEvent = queue.take(); //blocks until an event is added to the queue 
// increment int and do logic here 
6

Semaphore vẻ như nó có thể gần gũi hơn với những gì bạn đang tìm kiếm, thực sự - nó cho phép bạn đợi cho đến khi một hoặc nhiều "giấy phép "có sẵn. AtomicInteger không có nghĩa là được sử dụng như thế nào bạn đang sử dụng nó.

0

Nếu bạn đang sử dụng API Executors, đúng cách để hoàn thành nhiệm vụ đang sử dụng API tương lai. Mã mẫu được hiển thị bên dưới:

Future<?> future = threadPool.submit(task); 
future.get(); 
0

Tôi nghĩ một kết hợp gần hơn với những gì bạn muốn là Phaser. Sự hiểu biết sơ bộ của tôi là nó giống như một bộ đếm gia tăng nơi bạn có thể chặn cho đến khi số được tăng lên.

// This constructor one party (so it expects one advance per phase). 
Phaser phaser = new Phaser(1); 
try { 
    // This will timeout as phase 0 hasn't arrived yet. 
    phaser.awaitAdvanceInterruptibly(0, 1, TimeUnit.MILLISECONDS); 
    fail(); 
} 
catch (TimeoutException expected) { 
} 

// Arrive phase 0 
phaser.arrive(); 
phaser.awaitAdvance(0); 
try { 
    // Phase 1 will timeout.. 
    phaser.awaitAdvanceInterruptibly(1, 1, TimeUnit.MILLISECONDS); 
    fail(); 
} 
catch (TimeoutException expected) { 
} 

// Arrive phase 1 
phaser.arrive(); 
phaser.awaitAdvance(0); 
phaser.awaitAdvance(1); 
Các vấn đề liên quan