作为Java

时间:2017-05-06 12:02:24

标签: java multithreading lambda

我有一个类,Thread作为超类,我传递一个函数作为参数,这个类只执行该函数。该类使用它来创建线程,因此我可以在线程中执行任何函数,而无需创建不同的类。

public class ThreadEjecucionLambda extends Thread {
Runnable funcion;
public ThreadEjecucionLambda(Runnable funcion)
{
    this.funcion=funcion;
}
public void run()
{
    funcion.run();
}
}

现在,要创建同一方法的多个线程,我使用' for'阻止,例如:

for(Computer computer: Persistencia.getListComputers())
                            {
                                ThreadEjecucionLambda hilolambda=new ThreadEjecucionLambda(()->logica.EnciendeMonitor(computer.getNombrePC()));
                                hilolambda.run();
                            }

我想要达到的目的是概括前面的'所以我可以执行一个方法,我将传递给它作为参数,(在示例后面)一个'计算机'和一个功能。这种方法将执行' for'阻止并为每台计算机创建一个线程,因此我将上一个函数作为参数传递给线程,该函数将作为参数使用计算机'。 我想得到的是这样的事情(警告:它错了):

    public void EjecutaHilosLambdaSegundo(ArrayList<Computer> listapcs,Runnable funcion)
{
    for(Computer computer: listapcs)
    {
        ThreadEjecucionLambda hilolambda=new ThreadEjecucionLambda(funcion(computer));
        hilolambda.run();
    }
}

我希望自己能够很好地解释自己,因为这是一个非常令人困惑的问题。

1 个答案:

答案 0 :(得分:1)

对于同步解决方案,请查看@JB Nizet answer。

异步解决方案

首先,您的ThreadEjecucionLambda类不创建线程,因为要启动新线程,您需要调用start()的{​​{1}}方法。

Thread

其次,这堂课没有意义! public class ThreadEjecucionLambda extends Thread { Runnable funcion; public ThreadEjecucionLambda(Runnable funcion) { super(funcion); this.funcion = funcion; } public void run() { super.start(); } } 已经在那样工作了。

第三,Thread不接受参数。您实际需要做的是创建一个以Runnable为参数的Runnable

Computer

然后将它用于上述方法。

public class MyRunnable implements Runnable {

    Computer computer;

    public MyRunnable(Computer computer)
    {
        this.computer = computer;
    }

    @Override
    public void run()
    {
        // Do what you want cause a pirate is-
        // Erm do what you want with your computer object
    }
}