我有一个可以运行很长时间(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?
答案 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)
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
步骤:
AtomicInteger
相关的SE问题:
答案 2 :(得分:-1)
如果我理解你的问题,它看起来真的像观察者设计模式:
文档:https://en.wikipedia.org/wiki/Observer_pattern
观察者模式是一个软件设计模式,其中一个对象, 称为主题,维护其受抚养人名单,称为 观察者,并自动通知他们任何状态变化, 通常通过调用他们的一种方法。它主要用于 实现分布式事件处理系统。观察者模式是 也是熟悉的模型 - 视图 - 控制器(MVC)中的关键部分 建筑模式。[1]观察者模式实现于 众多编程库和系统,包括几乎所有的GUI 工具包。