2012-06-19 25 views
7

Trong Java, tôi cần thiết phải triển khai một lớp mở rộng chuỗi trong một lớp tương tự khác. Điều đó có thể không?Tôi có thể chạy một chuỗi trong một chuỗi trong java không?

Một ví dụ về những gì tôi đang cố gắng làm là như sau (giản thể) đoạn:

// The first layer is a Thread 
public class Consumer extends Thread { 

    // Variables initialized correctly in the Creator 
    private BufferManager BProducer = null; 

    static class Mutex extends Object {} 
    static private Mutex sharedMutex = null; 


    public Consumer() { 
     // Initialization of the thread 
     sharedMutex = new Mutex(); 

     BProducer = new BProducer(sharedMutex); 
     BProducer.start(); 
    } 


    public void run() { 

     int data = BProducer.getData(); 

     ///// .... other operations 
    } 


    ////// ...... some code 

    // Also the second layer is a Thread 
    private class BufferManager extends Thread { 

     Mutex sharedMutex; 
     int data; 

     public BufferManager(Mutex sM) { 
      sharedMutex = sM; 
     } 

     public int getData(Mutex sM) { 
      int tempdata; 
      synchronized(sharedMutex) { 
       tempdata = data; 
      } 
      return tempdata; 
     } 

     public void run() { 
      synchronized(sharedMutex) { 
       data = getDataFromSource(); 
      } 
      ///// .... other operations on the data 
     } 
    } 
} 

Các Chủ đề thứ hai được thực hiện trực tiếp bên trong một đầu tiên. Hơn nữa tôi muốn biết nếu thực hiện một Mutex như thế sẽ làm việc. Nếu không, có cách nào tốt hơn (tiêu chuẩn) để làm điều đó?

Cảm ơn bạn trước.

+8

Đây không phải là khởi động. – mre

+3

.. Làm sao bạn biết chắc chắn? – BlackVegetable

+1

Tất cả các chủ đề được bắt đầu bởi chủ đề khác, bạn không có một sự lựa chọn. Các chủ đề để làm việc độc lập nhất có thể. –

Trả lời

18

Thread không chạy 'bên trong', mà đúng hơn là song song.

Vì vậy, có, bạn có thể bắt đầu một số khác Thread để chạy song song với hai số khác Thread của bạn. Trên thực tế, bất kỳ Thread nào cũng có thể bắt đầu một số Thread khác (miễn là hệ điều hành cho phép nó).

+0

Cảm ơn bạn @ nicholas.hauschild. Vì vậy, thực tế được viết bên trong không thay đổi hành vi của Chủ đề. Mutex được chia sẻ theo bạn? Nó sẽ chặn Người tiêu dùng nếu Người quản lý bộ đệm đã khóa nó? – 2dvisio

+0

Vâng, tôi không chắc chắn mã bạn đã cung cấp sẽ biên dịch ('BProducer mới (sharedMutex)'?) Nhưng tôi nghĩ rằng 'Mutex' của bạn sẽ cho phép' Producer' và 'Consumer' khóa đúng cách. –

+0

Xem câu trả lời của tôi để biết chi tiết, nhưng tôi đề nghị rằng các khai báo của các biến Mutex là cuối cùng. – user949300

5

Có, tính năng này sẽ hoạt động và Mutex dùng chung nên thực hiện công việc. Ra khỏi hoang tưởng, tôi muốn thực hiện cả hai tuyên bố mutex final để tránh bất kỳ vấn đề "thoát" lạ nào. ví dụ.

Một đề xuất: có thể đây là phong cách của tôi, nhưng đối với mã như thế này, tôi hiếm khi mở rộng Thread. Chỉ cần triển khai Runnable. IMO hơi khó hiểu một chút (YMMV ở đây). Ngoài ra, khi bạn bắt đầu sử dụng các tiện ích đồng thời nâng cao như Executor, chúng sẽ xử lý Runnables, chứ không phải Chủ đề.

+0

+1 Điểm tuyệt vời về 'Runnables'. Sẽ khó khăn cho các lớp 'java.util.concurrent' để cho phép' Thread' gộp mà không sử dụng 'Runnable'. –

+0

Tôi vừa xem câu trả lời của bạn. Bằng cách thực hiện Runnable bạn có nghĩa là làm tổ Runnables có thể làm việc là tốt? – 2dvisio

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