2010-03-28 41 views
44

Có ai có thể đưa ra một chương trình ví dụ giải thích các luồng Java một cách đơn giản không? Ví dụ: giả sử tôi có ba chủ đề t1, t2t3. Tôi muốn một mã chứng minh rằng các chủ đề thực hiện đồng thời, và không tuần tự.Ví dụ về chủ đề Java?

+3

Vì vậy, câu hỏi của bạn chính xác là gì? Ngay bây giờ nó có vẻ như "cho tôi mã" và chúng tôi không làm điều đó ... chưa kể, ngay cả trong trường hợp đó tôi không chắc chắn chính xác những gì mã này bạn dường như muốn có nghĩa vụ phải làm. –

+1

Chỉ cần hiểu lập trình đồng thời bằng ví dụ thực tế David. – JavaUser

+0

Tôi lấy câu hỏi của bạn để có nghĩa là bạn muốn có một ví dụ để chứng minh rằng chủ đề làm những gì họ nói họ sẽ làm, trực quan. Tôi hy vọng câu trả lời của tôi sẽ giúp, mặc dù đầu ra của mỗi thread là bất cứ điều gì nhưng thực tế. – Phil

Trả lời

74

Dưới đây là một ví dụ đơn giản:

ThreadTest.java

public class ThreadTest 
{ 
    public static void main(String [] args) 
    { 
     MyThread t1 = new MyThread(0, 3, 300); 
     MyThread t2 = new MyThread(1, 3, 300); 
     MyThread t3 = new MyThread(2, 3, 300); 

     t1.start(); 
     t2.start(); 
     t3.start(); 
    } 
} 

MyThread.java

public class MyThread extends Thread 
{ 
    private int startIdx, nThreads, maxIdx; 

    public MyThread(int s, int n, int m) 
    { 
     this.startIdx = s; 
     this.nThreads = n; 
     this.maxIdx = m; 
    } 

    @Override 
    public void run() 
    { 
     for(int i = this.startIdx; i < this.maxIdx; i += this.nThreads) 
     { 
     System.out.println("[ID " + this.getId() + "] " + i); 
     } 
    } 
} 

Và một số kết quả:

[ID 9] 1 
[ID 10] 2 
[ID 8] 0 
[ID 10] 5 
[ID 9] 4 
[ID 10] 8 
[ID 8] 3 
[ID 10] 11 
[ID 10] 14 
[ID 10] 17 
[ID 10] 20 
[ID 10] 23 

Giải thích - Mỗi đối tượng MyThread cố gắng in số từ 0 đến 300, nhưng chúng chỉ chịu trách nhiệm cho một số vùng nhất định trong phạm vi đó. Tôi đã chọn để phân chia nó theo các chỉ mục, với mỗi chủ đề nhảy về phía trước bởi tổng số chủ đề. Vì vậy, t1 làm chỉ số 0, 3, 6, 9, vv

Bây giờ, mà không IO, tính toán tầm thường như thế này vẫn có thể trông như đề đang thực hiện tuần tự, đó là lý do tôi chỉ cho thấy phần đầu của đầu ra . Trên máy tính của tôi, sau khi chủ đề đầu ra này với ID 10 kết thúc tất cả cùng một lúc, tiếp theo là 9, sau đó 8. Nếu bạn đặt vào một chờ đợi hoặc một năng suất, bạn có thể nhìn thấy nó tốt hơn:

MyThread.java

System.out.println("[ID " + this.getId() + "] " + i); 
Thread.yield(); 

và kết quả:

[ID 8] 0 
[ID 9] 1 
[ID 10] 2 
[ID 8] 3 
[ID 9] 4 
[ID 8] 6 
[ID 10] 5 
[ID 9] 7 

Bây giờ bạn có thể nhìn thấy từng thực hiện thread, từ bỏ quyền kiểm soát sớm, và tiếp theo thực hiện.

+1

Thx Phil .. câu trả lời thực sự tốt đẹp mà tôi mong đợi chính xác. – JavaUser

7

Không đảm bảo rằng các chuỗi của bạn đang thực thi đồng thời bất kể bất kỳ ví dụ tầm thường nào mà người khác đăng. Nếu hệ điều hành của bạn chỉ cung cấp cho một quá trình java một bộ xử lý để làm việc trên, chủ đề java của bạn sẽ vẫn được lên kế hoạch cho mỗi lát thời gian trong một vòng robin thời trang. Có nghĩa là, không có ai sẽ thực hiện đồng thời, nhưng công việc họ làm sẽ được xen kẽ. Bạn có thể sử dụng các công cụ giám sát như Visual VM của Java (tiêu chuẩn trong JDK) để quan sát các luồng thực thi trong một tiến trình Java.

+1

Tim, có vẻ như đó là một câu hỏi thực sự. OP cho biết ông chỉ muốn một ví dụ thực tế (chắc chắn OP có thể google nó, nhưng nó không nhất thiết phải là một câu hỏi không hợp lệ). – Kiril

+4

Tôi nghĩ ý tôi là nó không thực sự là một câu hỏi theo nghĩa là nó không phù hợp với định dạng Hỏi & đáp. Thay vào đó, nó yêu cầu mã mẫu. Bất kể, nó đã được mài mòn vì vậy tôi chỉnh sửa câu trả lời của tôi, mà vẫn còn chính xác về mặt kỹ thuật. Không có cách nào để chứng minh dứt khoát việc thực thi đồng thời. Ngay cả câu trả lời được chấp nhận cũng chỉ thể hiện sự xen kẽ. –

3

Một ví dụ đơn giản:

public class Test extends Thread { 
    public synchronized void run() { 
     for (int i = 0; i <= 10; i++) { 
      System.out.println("i::"+i); 
     } 
    } 

    public static void main(String[] args) { 
     Test obj = new Test(); 

     Thread t1 = new Thread(obj); 
     Thread t2 = new Thread(obj); 
     Thread t3 = new Thread(obj); 

     t1.start(); 
     t2.start(); 
     t3.start(); 
    } 
} 
0

tạo ứng dụng java mà bạn xác định hai chủ đề cụ thể là t1 và t2, chủ đề t1 sẽ tạo ra ngẫu nhiên số 0 và 1 (mô phỏng tung đồng xu). 0 có nghĩa là đầu và một có nghĩa là đuôi. các chủ đề khác t2 sẽ làm tương tự t1 và t2 sẽ lặp lại vòng lặp này 100 lần và cuối cùng ứng dụng của bạn nên xác định số lần t1 đoán số được tạo ra bởi t2 và sau đó hiển thị số điểm. ví dụ: nếu chuỗi t1 đoán 20 số trong số 100 thì điểm t1 là 20/100 = 0,2 nếu t1 đoán 100 số sau đó nó được điểm 1 và như vậy trên