Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中作为函数参数的函数_Java_Multithreading_Lambda - Fatal编程技术网

在Java中作为函数参数的函数

在Java中作为函数参数的函数,java,multithreading,lambda,Java,Multithreading,Lambda,我有一个类,线程作为超类,我传递一个函数作为参数,这个类只执行这个函数。这个类使用它来创建线程,所以我可以在线程中执行任何函数,而不必创建其他类 public class ThreadEjecucionLambda extends Thread { Runnable funcion; public ThreadEjecucionLambda(Runnable funcion) { this.funcion=funcion; } public void run() { funcio

我有一个类,线程作为超类,我传递一个函数作为参数,这个类只执行这个函数。这个类使用它来创建线程,所以我可以在线程中执行任何函数,而不必创建其他类

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”,这样我就可以执行一个方法,我将把它作为参数传递给它,(下面的例子)一个“计算机”列表和一个函数。此方法将执行'for'块,并为每台'Computer'创建一个线程,因此我将前一个函数作为参数传递给线程,该函数将具有'Computer'作为参数。 我想要得到的是这样的东西(警告:这是错误的):

public void ejecuthiloslambdaseGundo(ArrayList listapcs,可运行函数)
{
适用于(计算机:listapcs)
{
ThreadEjecucionLambda hilolambda=新的ThreadEjecucionLambda(功能(计算机));
hilolambda.run();
}
}

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

线程已经有了,并且在启动它时执行它,所以您的子类是无用的和令人困惑的。不仅如此,你从来没有真正开始任何线程。因此,您可以直接运行Runnable,而无需创建任何线程或ThreadEcutionLambda

如果我理解正确,您希望在计算机列表上以计算机为参数执行相同的函数

你不需要一根线就能做到这一点。您只需要一个
消费者


不要重新发明轮子

对于同步解决方案,请查看答案


异步解决方案

首先,您的
threadejeucionlambda
类没有创建线程,因为要启动新线程,需要调用
thread
start()
方法

public class ThreadEjecucionLambda extends Thread {

    Runnable funcion;

    public ThreadEjecucionLambda(Runnable funcion)
    {
        super(funcion);
        this.funcion = funcion;
    }
    public void run()
    {
        super.start();
    }
}
第二,这门课毫无意义<代码>线程已经以这种方式工作

第三,
Runnable
as-is不接受参数。实际上,您需要做的是创建自己的
Runnable
,它将
计算机
作为参数

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
    }
}
然后将其用于上述方法

public void EjecutaHilosLambdaSegundo(ArrayList<Computer> listapcs, MyRunnable myRunnable)
{
    for(Computer computer: listapcs)
    {
        Thread myThread = new Thread(myRunnable);
        myThread.start();
    }
}
public void ejecuthiloslambdaseGundo(ArrayList listapcs,MyRunnable MyRunnable)
{
适用于(计算机:listapcs)
{
线程myThread=新线程(myRunnable);
myThread.start();
}
}

你是否意识到你的
threadejeucionlambda
做的正是
Thread
要做的事?:^)不仅如此,你从来没有真正开始任何线程。因此,您可以直接运行Runnable,而无需创建任何线程或ThreadEcutionLambda。您可以使用示例FYI创建不同的实现:您实际上不能在Java中传递函数。您传递的是一个对象的引用,该对象实现了几乎相同的
@functioninterface
Runnable
接口定义了一个不带参数并返回
void
的方法,但是在
java.util.function
包中声明了40多个其他
@functionanterface
接口,如果这些接口都不满足您的需要,您可以随时声明自己的接口。
public class ThreadEjecucionLambda extends Thread {

    Runnable funcion;

    public ThreadEjecucionLambda(Runnable funcion)
    {
        super(funcion);
        this.funcion = funcion;
    }
    public void run()
    {
        super.start();
    }
}
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
    }
}
public void EjecutaHilosLambdaSegundo(ArrayList<Computer> listapcs, MyRunnable myRunnable)
{
    for(Computer computer: listapcs)
    {
        Thread myThread = new Thread(myRunnable);
        myThread.start();
    }
}