这个想法是:
我有一个主类,在这个类中我想创建一个线程。该线程必须每 10 分钟返回一次数据(我知道普通线程实现是不可能的)。
我看到了一些关于 Callable 或 ScheduledExecutionr 的实现,但我无法适应它。
我需要它,因为在程序执行期间,我的数据库正在更新。所以我想要一个线程,每 10 分钟执行一次查询并返回结果。
谢谢。
一个简单的可调用解决方案
interface Callable {
void call(Data d);
}
class MyThread implements Runnable{
Callable callable;
public MyThread(Callable c){
callable = c;
}
void run(){
while(true){
callable.call(/** pass your data */);
//sleep 10 minutes
}
}
}
现在,您可以从代码创建一个 MyThread 对象,并向其传递一个可调用对象。您可以使用匿名类执行此操作
MyThread t = new MyThread(new Callable(){
void call(Data d){
//process data here
}
});
当您想安排定期发生某事时,您可以使用具有一个或多个java.util.TimerTask
的java.util.Timer
。
但是,无论您是使用计时器还是使用自己的线程实现自己的时间调度,您都需要某种方式从线程/计时器任务与主线程中的对象进行通信。可以通过将这些对象传递给这些线程来实现这一点,然后在运行方法中对它们调用方法。但请记住,当从子线程调用该方法时,您无法控制主线程正在执行的操作。当主线程当前正在对其执行某些操作时,子线程可能会不时更改值。这可能会导致通常称为争用条件的奇怪错误。举个例子:
class ValueList {
private List<Integer> values = new ArrayList<>();
// this method may be called from many different threads to add values
public void add(Integer i) {
values.add(i);
}
// this method is called from the main thread to update the GUI
public int getAverage() {
int sum = 0;
for (Integer i: values) {
sum += i;
}
// Imagine a thread calls add(Integer) when the main threads
// execution is exactly here!
// the average will be too low because the new value was
// not yet counted for the sum, but is now accounted for
// when calculating the average from the sum.
return sum / values.size();
}
}
要防止这种情况发生,请熟悉 Java 提供的各种同步功能。
线程都存在于父进程的同一内存空间中,因此在线程之间传递数据实际上非常简单。 这样做的最基本方法是简单地覆盖一个公共内存位置(比如两个线程都知道的公共对象中的字符串),尽管这不是很好的做法。
在执行多线程数据时,您需要注意语义,因为在实现多线程应用程序时引入竞争条件和各种其他错误是一个常见的错误。
仅举一个例子:http://en.wikipedia.org/wiki/Producer–consumer_problem
查看java.lang.concurrency类可能会让你对如何在线程之间安全地传递数据有所了解,但请注意这是一个相当复杂的计算机科学领域,并适当地计划你的学习时间:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/package-tree.html