java多线程数据隔离问题

发布于 2022-09-11 20:00:21 字数 1249 浏览 11 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

情话难免假 2022-09-18 20:00:21

问题你为何要把需要处理的数据作为全局变量?线程隔离的方法很简单,就是所有线程都有自己单独的数据,互不相干,一个简单的原则就是不使用static数据,而是使用实例字段。

你为何要用static?是为了把需要处理的数据传递给线程吗?如果需要传递数据,应该在new Thread(test1Runnable)这个地方传递,用test1Runnable的实例字段传递参数。

另一种方法是用队列来传递数据,一个线程不停的从输入队列中取出需要处理的数据,处理完之后把结果写入另一个输出队列中,直到输入队列空。队列是共享数据,操作队列的时候用synchronized做互斥。

北渚 2022-09-18 20:00:21

add方法加锁,多个线程公用一个Test1Runnable实例

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文