首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何访问正在运行的线程的属性值

如何访问正在运行的线程的属性值
EN

Stack Overflow用户
提问于 2016-06-28 18:21:04
回答 3查看 183关注 0票数 1

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

代码语言:javascript
复制
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++;
        }
    }
}

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

EN

回答 3

Stack Overflow用户

发布于 2016-06-28 18:25:34

简单地说,您可以通过向线程类添加一些getter来获得它,正如@RomanKonoval所说的那样,它需要是同步的

代码语言:javascript
复制
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;
    }
}

在你的另一个类中,你可以使用类似的东西

代码语言:javascript
复制
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);      
   }

}

然后,您可能需要实现计时器任务。

代码语言:javascript
复制
public class MyTimerTask extends TimerTask { 
    private ExportThread exportThread;
    public MyTimerTask(ExportThread exportThread){
        this.exportThread = exportThread;
    }
    @Override
    public void run() {
        System.out.println(exportThread.getTotalExports());
    }
}
票数 3
EN

Stack Overflow用户

发布于 2016-06-28 20:57:18

使用AtomicInteger的无锁解决方案

代码语言:javascript
复制
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 {

}

输出:

代码语言:javascript
复制
total export:2

步骤:

  1. Define one AtomicInteger
  2. Increment

提供get()方法

相关SE问题:

Practical uses for AtomicInteger

票数 2
EN

Stack Overflow用户

发布于 2016-06-28 18:31:12

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

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

观察者模式是一种软件设计模式,在该模式中,称为主题的对象维护其依赖项的列表,称为观察者,并自动通知它们任何状态更改,通常通过调用它们的方法之一。它主要用于实现分布式事件处理系统。观察者模式也是熟悉的模型-视图-控制器体系结构模式的关键部分。1观察者模式在许多编程库和系统中实现,包括几乎所有的图形用户界面工具包。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38073518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档