从java中的另一个线程访问线程的变量

我试图在java中的另一个线程中访问和修改线程的变量,我真的不知道如何做到这一点。

例如:

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(); 

谢谢你,如果你有任何想法!

有没有办法在java中为线程创建一个getter和setter?

编辑:答案很好,但我不清楚我的问题,我会尝试提出一个更好的问题

您可以使其工作,但我建议您使用在线程之间共享的AtomicInteger 。

 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(); } } 

您可以使用AtomicReference来引用对象。

创建一个runnable,并使用你在runnable中定义的setter和getter。

 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(){} } 

注意此处使用volatile关键字。 volatile关键字确保如果此String在一个线程中发生更改,则所有线程都将看到更改。 相反,如果我确保对String对象的唯一访问是通过synchronized上下文,那么volatile关键字就没有必要了。

为了certificate我的观点,上面的代码和下面的代码都是线程安全的但是不同,因为在下面的例子中没有2个线程可以同时输入setStringgetString

 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(){} } 

线程实际上只是执行一个runnable。 您可以像这样使用它:

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

使用原语的primefaces值很好,但是如果你想共享一个更复杂的对象,你将不得不阅读线程和同步。

例如:

 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()); } } } } 

此代码显示了通过synchronized关键字与非基本对象同步的示例。 在方法定义中使用synchronized关键字将类本身锁定为同步对象。

最后一点,synchronized关键字不仅仅用在方法定义中。 您可以使用它来同步方法中的实例,就像我在StatRunnable中的run方法中StatRunnable