我如何实现无限线程返回数据?

时间:2014-04-07 12:27:14

标签: java multithreading runnable callable

这个想法是:

我有一个主类,在这个类中我想创建一个线程。该线程必须每10分钟返回一次数据(我知道正常的线程实现是不可能的)。

我看到了一些关于Callable或ScheduledExecuter的实现,但我无法适应它。

我需要它,因为在程序执行期间我的数据库正在更新。所以我想要一个每10分钟执行一次查询并返回结果的线程。

感谢。

3 个答案:

答案 0 :(得分:2)

简单的可调用解决方案

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对象,并将其传递给Callable。您可以使用anonymous class

执行此操作
MyThread t = new MyThread(new Callable(){
    void call(Data d){
        //process data here
    }
});

答案 1 :(得分:1)

如果您希望定期安排某些事情,可以使用java.util.Timer一个或多个java.util.TimerTask

但无论您是使用计时器还是使用自己的线程实现自己的时间安排,都需要某种方式从Threads / TimerTasks与主线程中的对象进行通信。您可以通过将这些对象传递给这些线程然后在run-method中调用它们上的方法来实现它。但请记住,当从子线程调用该方法时,您无法控制主线程正在执行的操作。当主线程当前正在执行某些操作时,子线程可能会不时更改一个值。这可能导致通常被称为竞争条件的奇怪错误。举个例子:

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();
    }
}

为防止这种情况发生,请熟悉the various synchronization features offered by Java

答案 2 :(得分:0)

线程都存在于父进程的同一内存空间中,因此在线程之间传递数据实际上非常简单。最基本的方法是简单地覆盖一个公共内存位置(比如两个线程都知道的公共对象中的字符串),尽管不是很好的做法。

在执行多线程数据时,需要注意语义,因为在实现多线程应用程序时引入竞争条件和各种其他不良行为是一个常见的错误。

仅举一个例子:http://en.wikipedia.org/wiki/Producer - consumer_problem

查看java.lang.concurrency类可能会让您了解如何在线程之间安全地传递数据,但请注意这是一个相当复杂的计算机科学领域,并适当地规划您的学习时间:{{3 }}