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 setString
và getString
đồ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
.
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