从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个线程可以同时输入setString
和getString
。
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
。
- java.lang.NoClassDefFoundError:org / openxmlformats / schemas / spreadsheetml / x2006 / main / CTWorkbook $ Factory
- 输入类型=“日期”百里香
- 在MongoDB和Apache Solr之间同步数据的简便方法
- 我可以从任意异步任务访问Http.Context.current()吗?
- 如何在Java中读取LDAP密码策略
- Spring Data JPARepository:如何有条件地获取子项
- 文件存在时具有所有权限的FileNotFoundException
- 分代垃圾收集如何运作?
- 二进制搜索以在旋转的排序列表中查找旋转点