2015-04-26 62 views
5

Tôi đang cố gắng tạo nhiều luồng bằng cách sử dụng vòng lặp for trong java để chúng chia sẻ cùng một bộ đếm biến. Tôi đang làm một cái gì đó sai vì tôi muốn truy cập để tăng cho mỗi chủ đề.Cách tạo nhiều luồng bằng cách sử dụng vòng lặp trong java

Đây là đầu ra cho đoạn mã sau:

Counter: 1
Counter: 1
Counter: 1

public static void main(String[] args) { 
    int numThreads = 3; 
    for (int i = 0; i < numThreads; i++) { 
     Create c = new Create(); 
     Thread thread = new Thread(c); 
     thread.start(); 
    } 
} 


public class Create implements Runnable { 
    int counter = 0; 

    public void run() { 
     counter++; 
     System.out.println("Counter: " + counter); 
    } 
} 

Trả lời

9

Khai counter như staticvolatile:

static volatile int counter = 0; 

và cả 3 chủ đề sẽ chia sẻ nó.

Chú ý, mặc dù biến động chăm sóc khả năng hiển thị (khi một luồng cập nhật nó - thay đổi sẽ hiển thị theo các chủ đề khác), nó không quan tâm đến nguyên tử của sửa đổi, vì vậy bạn nên đồng bộ hóa phần đó bạn tăng nó, hoặc tốt hơn là sử dụng một AtomicInteger

2

My giới thiệu, (& nhặt chỉnh sửa alfasin của), hãy xem xét Tạo thi này lớp:

import java.util.concurrent.atomic.AtomicInteger; 

public class Create implements Runnable { 
    static AtomicInteger classCounter = new AtomicInteger(); 
    AtomicInteger objCounter = new AtomicInteger(); 
    public void run() { 
     System.out.println("Class Counter: " + classCounter.incrementAndGet()); 
     System.out.println("Object Counter: " + objCounter.incrementAndGet()); 
    } 
} 
+0

Và này 'counter' sẽ đếm mỗi chủ đề duy nhất mà lớp phương thức '#run()'? – Tom

+0

Không, hiện tại nó tính phương thức chạy (thực thi) s của một đối tượng 'Create', để đạt được điều này ở cấp độ lớp, bạn cần làm cho' counter' tĩnh. (hoặc trong phương pháp chính của bạn: chỉ cần tạo một 'Tạo' cho tất cả các chủ đề.) – xerx593

+2

Bạn biết điều đó, vậy làm cách nào để chỉnh sửa mã của bạn để phù hợp với các yêu cầu của OP? – Tom

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