java - 我可以在 run 方法中保留 Java 线程的计数器吗?

标签 java multithreading

我有一个类变量 sum。每次我启动一个新线程时,我都希望总和增加。看来 run 只被调用一次,我找不到更好的信息来告诉我更多有关它的信息。有没有办法可以用锁来实现这一点?这是一些简单的代码:

public class MyClass implements Runnable{
    static int sum = 0;
    public static void main(String[] args) throws InterruptedException {
        for(int i = 0; i < 5; ++i){
            Thread t = new Thread(new MyClass());
            t.start();
            t = null;
        }
    }
    @Override
        public synchronized void run() {
        ++sum;
        System.out.println(sum);
    }
}

最佳答案

在静态变量中保留可变状态是一种不好的做法,但这就是解决此问题的方法:

public class MyClass implements Runnable {

    static AtomicInteger counter = new AtomicInteger(0);

    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < 5; ++i) {
            Thread t = new Thread(new MyClass());
            t.start();
            t = null;
        }
    }

    @Override
    public void run() {
        int sum = counter.incrementAndGet();
        System.out.println(sum);
    }
}

关于java - 我可以在 run 方法中保留 Java 线程的计数器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29857692/

相关文章:

c - Linux 下的 TCP 客户端/服务器

multithreading - 创建 BackgroundWorkers 的线程似乎将 Completed 事件排队

java - Eclipse 插件作为文件夹而不是 jar

Java-选项卡上的按键监听器不起作用

java - 如何解决 java 6 ssl 错误

java - 如何从代码中返回前 2 个最大值

java - 如何将 JUnit 测试用例的多个输入模拟到我的程序中?

android - 主线程和UI线程的区别

ios - CLLocationManager didUpdateToLocation :, 在哪个线程上?

Java 在线程池中安全地存储和恢复未完成的任务