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