java多线程数据隔离问题
package test.test1;
public class Test1 {
public static void main(String[] args) {
Test1Runnable test1Runnable = new Test1Runnable();
Thread thread = new Thread(test1Runnable);
thread.start();
Execute.PARAM_1=2;
Execute.PARAM_2=4;
}
}
package test.test1;
public class Test1Runnable implements Runnable {
@Override
public void run() {
Execute execute = new Execute();
while (true){
try {
execute.add();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
package test.test1;
public class Execute {
public static int PARAM_1=0;
public static int PARAM_2=0;
public void add() throws InterruptedException {
if (PARAM_1!=0&&PARAM_2!=0){
int res = PARAM_1+PARAM_2;
System.out.println("输出结果:"+res);
PARAM_1=0;
PARAM_2=0;
}
}
}
我在一个方法中定义两个全局变量,然后启动线程不停的执行这个方法,直到这两个全局变量的值都不为0时,开始执行加法运算。
上述代码:启动时 我赋值给param1=2 、param2=4
如果我想同时运行 2+4 、3+5 该怎么做?
比如:如果赋值给param1=2时 恰巧param2=5 了 怎么办?
谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
问题你为何要把需要处理的数据作为全局变量?线程隔离的方法很简单,就是所有线程都有自己单独的数据,互不相干,一个简单的原则就是不使用static数据,而是使用实例字段。
你为何要用static?是为了把需要处理的数据传递给线程吗?如果需要传递数据,应该在new Thread(test1Runnable)这个地方传递,用test1Runnable的实例字段传递参数。
另一种方法是用队列来传递数据,一个线程不停的从输入队列中取出需要处理的数据,处理完之后把结果写入另一个输出队列中,直到输入队列空。队列是共享数据,操作队列的时候用synchronized做互斥。
add方法加锁,多个线程公用一个Test1Runnable实例