如何访问正在运行的Thread的属性值

时间:2016-06-28 10:21:04

标签: java multithreading

我有一个可以运行很长时间(5-6分钟)的线程。

public class ExportThread implements Runnable {
    private Integer totalExport = 0;

    @Override
    public void run() {
        try {
            exportCorner();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void exportCorner() {
        List<MyObject> list = ......
        for(MyObject o : list){
            .......
            totalExport++;
        }
    }
}

此Thread从另一个类运行。如何在一小段时间后一次又一次地获得totalExport?

3 个答案:

答案 0 :(得分:3)

只需通过向线程类中添加一些getter来获取它,因为@RomanKonoval说它需要同步

public class ExportThread implements Runnable {
    private Integer totalExport = 0;

    @Override
    public void run() {
        try {
            exportCorner();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void exportCorner() {
        List<Integer> list = ......
        for(Integer i : list){
            totalExport += i;
        }
    }

    public synchronized Integer getTotalExport(){
        return this.totalExport;
    }
}

从你的其他课程中你可以使用类似的东西

import java.util.*;

public class MainClass {
   public static void main(String[] args) {
       ExportThread exportThread = new ExportThread();
       Thread t = new Thread(exportThread); 
       t.start(); 

      TimerTask timerTask= new MyTimerTask(exportThread);
      Timer timer = new Timer();

      timer.scheduleAtFixedRate(tasknew,new Date(),1000);      
   }

}

然后您可能需要实施计时器任务

public class MyTimerTask extends TimerTask { 
    private ExportThread exportThread;
    public MyTimerTask(ExportThread exportThread){
        this.exportThread = exportThread;
    }
    @Override
    public void run() {
        System.out.println(exportThread.getTotalExports());
    }
}

答案 1 :(得分:2)

使用AtomicInteger

的无锁解决方案
import java.util.*;
import java.util.concurrent.atomic.*;

public class ExportThread implements Runnable {
    private AtomicInteger totalExport = new AtomicInteger(0);

    @Override
    public void run() {
        try {
            exportCorner();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void exportCorner() {
        List<MyObject> list = new ArrayList<MyObject>(10);
        list.add(new MyObject());
        list.add(new MyObject());
        for(MyObject o : list){
            totalExport.getAndIncrement();
        }
        System.out.println("total export:"+getTotalExport());
    }
    public Integer getTotalExport(){
        return totalExport.get();
    }
    public static void main(String args[]){
        ExportThread t = new ExportThread();
        new Thread(t).start();
    }
}
class MyObject {

}

输出:

total export:2

步骤:

  1. 定义一个AtomicInteger
  2. 增加值
  3. 提供get()方法
  4. 相关的SE问题:

    Practical uses for AtomicInteger

答案 2 :(得分:-1)

如果我理解你的问题,它看起来真的像观察者设计模式

文档:https://en.wikipedia.org/wiki/Observer_pattern

  

观察者模式是一个软件设计模式,其中一个对象,   称为主题,维护其受抚养人名单,称为   观察者,并自动通知他们任何状态变化,   通常通过调用他们的一种方法。它主要用于   实现分布式事件处理系统。观察者模式是   也是熟悉的模型 - 视图 - 控制器(MVC)中的关键部分   建筑模式。[1]观察者模式实现于   众多编程库和系统,包括几乎所有的GUI   工具包。