【问题标题】:Java Thread doesn't work when trying to change variable value尝试更改变量值时Java线程不起作用
【发布时间】:2017-06-19 09:24:20
【问题描述】:

我正在尝试使用 Java 线程,我正在尝试使用线程来通过另一个类中的线程更改我的类中名为 number 的一些变量。
但显然它不起作用,我总是从我开始价值时得到 0,也许有人可以告诉我原因。

这是我的第一堂课:

public class ThreadTest {
    public int number = 0;

    public static void main(String[] args) {
        ThreadTest Adding = new ThreadTest();
        Adding.addingOnes();
        System.out.println(Adding.number);
    }

    public void addingOnes() {
        Runnable thread1 = new ThreadClassPlus();
        Thread t1 = new Thread(thread1);
        t1.start();
        try {
            t1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void add() {
        number++;
    }
}

还有我的第二堂主题课:

public class ThreadClassPlus extends ThreadTest implements Runnable {
    public void run() {
        for(int i = 0; i < 10000; i++) {
            add();
        }
    }
}

【问题讨论】:

  • 在启动线程后立即加入线程毫无意义...好吧,也许它会帮助您学习一些关于线程的知识,但它永远不会有意义在真正的程序中做到这一点。

标签: java multithreading variables


【解决方案1】:

问题在于您的 ThreadTest 实例和您的 ThreadClassPlus 实例是不同的对象。在后一种情况下,您的线程正在递增number,但您的main 方法正在从前者读取number 的值。当然,前者没有后者的价值。

线程工作正常。问题在于你如何使用它。

这是一个更正的版本:

public class ThreadTest implements Runnable {

    public int number = 0;

    public static void main(String[] args) {
        ThreadTest adding = new ThreadTest();
        adding.addingOnes();
        System.out.println(adding.number);
    }

    public void addingOnes()
        Thread t1 = new Thread(this);
        t1.start();
        try {
            t1.join();
        } 
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void add() {
        number++;
    }

    public void run() {
        for(int i = 0; i < 10000; i++) {
            add();
        }
    }
}

请仔细注意我所做的各种样式更改。 Java 风格很重要。

【讨论】:

    【解决方案2】:

    仅仅是因为您正在增加属于对象thread1 的变量number 的值,同时打印属于对象Adding 的变量number 的值。

    只需打印出正确的变量值,您就会看到预期的结果:

        System.out.println(((ThreadClassPlus)thread1).number);
    

    顺便说一句,请不要以大写开头命名变量,这是非常糟糕的风格:Adding => adding.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-20
      • 2020-07-18
      • 2016-11-30
      • 2015-09-29
      • 2014-01-18
      相关资源
      最近更新 更多