2013-07-19 36 views
6

Tôi đang cố gắng truy cập và sửa đổi một biến của một chuỗi trong một chuỗi khác trong java và tôi thực sự không biết cách thực hiện điều này.Truy cập một biến của một chuỗi từ một chuỗi khác trong java

ví dụ:

Runnable r1 = new Runnable() { 
    int value = 10; 
    public void run() { 
     // random stuff 
    } 
} 
Runnable r2 = new Runnable() { 
    public void run() { 
     // of course the bellow line will not work 
     r1.value--; // I want here to be able to decrement the variable "value" of r1 
    } 
} 
Thread t1 = new Thread(r1); 
Thread t2 = new Thread(r2); 
t1.start(); 
t2.start(); 

cảm ơn bạn nếu bạn có bất kỳ ý tưởng!

Có cách nào để tạo trình khởi động và trình thiết lập cho một chuỗi trong java không?

EDIT: câu trả lời là tốt, nhưng tôi đã không rõ ràng trong câu hỏi của tôi, tôi sẽ cố gắng hỏi một câu hỏi tốt hơn

+0

Chủ đề không có biến. Các lớp có các thành viên và các phương thức có các tham số và các biến cục bộ. Nếu bạn phân tích lại vấn đề của mình dọc theo các dòng đó thì câu trả lời phải rõ ràng. – EJP

Trả lời

4

Bạn có thể sắp xếp công việc nhưng, tôi khuyên bạn nên sử dụng một số AtomicInteger được chia sẻ giữa các chuỗi.

final AtomicInteger value = new AtomicInteger(10); 
Runnable r1 = new Runnable() { 
    public void run() { 
     // random stuff using value 
    } 
} 
Runnable r2 = new Runnable() { 
    public void run() { 
     value.decrementAndGet(); 
    } 
} 

Bạn có thể sử dụng AtomicReference để tham chiếu đến đối tượng.

4

Tạo một Runnable, và sử dụng setters và getters bạn định nghĩa trong nói Runnable.

public class MyRunnable implements Runnable{ 
    private volatile String myString; 
    public String setString(String value){this.myString = value;} 
    public String getString(){ 
     return myString; 
    } 
    public void run(){} 
} 

Lưu ý volatile từ khóa được sử dụng tại đây. Các từ khóa dễ bay hơi đảm bảo nếu chuỗi này thay đổi trong một chủ đề, rằng tất cả các chủ đề sẽ thấy sự thay đổi. Nếu thay vào đó, tôi đảm bảo rằng quyền truy cập duy nhất vào đối tượng String là thông qua bối cảnh được đồng bộ hóa, thì từ khóa dễ bay hơi sẽ không cần thiết.

Để chứng minh quan điểm của tôi, mã trên và mã bên dưới đều an toàn theo luồng nhưng khác nhau vì không có 2 chuỗi nào có thể nhập setStringgetString đồng thời trong ví dụ bên dưới.

public class MyRunnable implements Runnable{ 
    private String myString; 
    public synchronized String setString(String value){this.myString = value;} 
    public synchronized String getString(){ 
     return myString; 
    } 
    public void run(){} 
} 

Chủ đề thực sự chỉ thực hiện một lần chạy. Bạn có thể sử dụng điều này như sau:

MyRunnable runnable = new MyRunnable(); 
Thread myThread = new Thread(runnable); 
myThread.start(); 
String myString = runnable.getString(); 

Sử dụng các giá trị nguyên tử cho nguyên thủy là tốt, nhưng nếu bạn đã bao giờ muốn chia sẻ một đối tượng phức tạp hơn, bạn sẽ phải đọc về threading and synchronization.

Ví dụ:

public class Stats{ 
    int iterations; 
    long runtime; 
    public Stats(){ 
     iterations = 0; 
     runtime=0; 
    } 
    public synchronized void setIterations(int value){this.iterations = value;} 
    public synchronized void setRuntime(long milliseconds){ 
     this.runtime = milliseconds; 
    } 
    public synchronized int getIterations(){ 
     return iterations; 
    } 
    public synchronized long getRuntime(){return runtime;} 
} 

public class StatRunnable implements Runnable{ 
    Stats stats; 
    boolean active; 
    public StatRunnable(){ 
     this.active=true; 
    } 
    public Stats getStats(){ 
     return stats; 
    } 
    long calculateRuntime(){return 0L;} 
    public void run(){ 
     while(active){ 
      //i'm synchronizing with stats to ensure no other thread alters values 
      //simultaneously. 
      synchronized(stats){ 
       stats.setIterations(stats.getIterations()+1); 
       stats.setRuntime(calculateRuntime()); 
      } 
     } 
    } 
} 

Mã này hiển thị ví dụ về đồng bộ hóa với các đối tượng không nguyên thủy thông qua từ khóa synchronized. Sử dụng từ khóa được đồng bộ hóa trong định nghĩa phương thức sẽ khóa lớp bằng cách sử dụng chính nó làm đối tượng đồng bộ hóa.

Lưu ý cuối cùng, từ khóa được đồng bộ hóa không chỉ được sử dụng trong định nghĩa phương pháp. Bạn có thể sử dụng nó để đồng bộ hóa trên các trường hợp trong các phương thức như tôi đã thực hiện trong phương thức run trong StatRunnable.

+0

Bạn có thể cung cấp một ví dụ trong chuỗi an toàn không? Điều này trông giống như mã ban đầu, nhưng với setter/getters cũng như truy cập trực tiếp đến trường. –

+0

Đây là luồng an toàn vì không có gì chạm vào chuỗi :) nhưng có, tôi sẽ viết một ví dụ phức tạp hơn. –

+0

AFAIK bạn đã thay thế 'String myString = runnable.myString;' bằng 'String myString = runnable.getString();' làm điều tương tự. –