如何将参数传递给Java线程?

如何将参数传递给Java线程?,java,multithreading,parameters,Java,Multithreading,Parameters,我的程序不起作用,如何改进我的示例 在这个代码中是错误的。Eclipse说,无法实例化行中的Synchro类型:Runnable threadTask=new Synchro(param1,param2) 另一个文件中的类Synchro:(此代码适用于Eclipse) 我想你的Synchro类应该是这样的 public class Synchro implements Runnable { private String argument1; private String argu

我的程序不起作用,如何改进我的示例

在这个代码中是错误的。Eclipse说,
无法实例化行中的Synchro类型:
Runnable threadTask=new Synchro(param1,param2)

另一个文件中的类
Synchro
:(此代码适用于Eclipse)


我想你的
Synchro
类应该是这样的

public class Synchro implements Runnable {
    private String argument1;
    private String argument2;

    // the arguments pass by constructor
    public Synchro(String argument1, String argument2) {
        this.argument1 = argument1;
        this.argument2 = argument2;
    }

    // you have to override run method, when you implement Runnable interface
    @Override
    public void run() {
        // your code
    }
}

以下是另一种在Java8中工作的方法:

button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        synchronizuj.setEnabled(false);
        final String param1 = main_catalog.getText();
        final String param2 = copy_catalog.getText();
        Thread newThread = new Thread (() -> {
            ...code to be executed in the thread goes here.
               It can refer to param1 and param2,
               but it can not change them...

        });
        newThread.start();
    }
});

new Thread(…)
的参数是一个lambda表达式——一种定义和实例化实现函数接口的匿名内部类的紧凑方式(注意:
Runnable
在Java8中被重新定义为函数接口。)

将其传递给构造函数。
Synchro
是抽象的。当然你不能实例化它。在我的例子中,最简单的方法是添加构造函数,还是其他方法?没有抽象类我能做到吗?是的。你为什么认为
Synchro
必须是
abstract
public class Synchro implements Runnable {
    private String argument1;
    private String argument2;

    // the arguments pass by constructor
    public Synchro(String argument1, String argument2) {
        this.argument1 = argument1;
        this.argument2 = argument2;
    }

    // you have to override run method, when you implement Runnable interface
    @Override
    public void run() {
        // your code
    }
}
button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        synchronizuj.setEnabled(false);
        final String param1 = main_catalog.getText();
        final String param2 = copy_catalog.getText();
        Thread newThread = new Thread (() -> {
            ...code to be executed in the thread goes here.
               It can refer to param1 and param2,
               but it can not change them...

        });
        newThread.start();
    }
});