我有一个线程,运行了很长时间(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++;
}
}
}此线程从另一个类运行。如何在一小段时间后一次又一次地获取totalExport?
发布于 2016-06-28 18:25:34
简单地说,您可以通过向线程类添加一些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());
}
}发布于 2016-06-28 20:57:18
使用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步骤:
AtomicInteger 提供get()方法
相关SE问题:
发布于 2016-06-28 18:31:12
如果我正确理解您的问题,它看起来真的很像观察者设计模式:
文档:https://en.wikipedia.org/wiki/Observer_pattern
观察者模式是一种软件设计模式,在该模式中,称为主题的对象维护其依赖项的列表,称为观察者,并自动通知它们任何状态更改,通常通过调用它们的方法之一。它主要用于实现分布式事件处理系统。观察者模式也是熟悉的模型-视图-控制器体系结构模式的关键部分。1观察者模式在许多编程库和系统中实现,包括几乎所有的图形用户界面工具包。
https://stackoverflow.com/questions/38073518
复制相似问题