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 如何将下面的示例转换为实现Runnable接口和重写run方法_Java_Multithreading_Inheritance - Fatal编程技术网

Java 如何将下面的示例转换为实现Runnable接口和重写run方法

Java 如何将下面的示例转换为实现Runnable接口和重写run方法,java,multithreading,inheritance,Java,Multithreading,Inheritance,我有两个简单的类,比如bellow。但是,我希望在类声明中实现runnable接口,而不是在线程对象声明中使用它。然而,我无法喘息如何转换成上述格式 public class Main{ static Runner r1 =new Runner(); public static void main(String[] args) { // TODO Auto-generated method stub Thread t1 = new Thread

我有两个简单的类,比如bellow。但是,我希望在类声明中实现runnable接口,而不是在线程对象声明中使用它。然而,我无法喘息如何转换成上述格式

public class Main{

    static Runner r1 =new Runner();
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Thread t1 = new Thread (new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    r1.firstThread();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });

        Thread t2 = new Thread (new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    r1.secondThread();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });

    }
}


public class Runner {
    public void firstThread() throws InterruptedException
    {
    }

    public void secondThread() throws InterruptedException
    {
    }
}

您已经在传递一个实现
Runnable
的对象,尽管它是一个匿名类

没有什么能阻止你把它拉到一个“命名”的类中,例如

public class RunnerFirstAction implements Runnable {
    private Runner runner;
    public RunnerFirstAction(Runner runner) {
        this.runner = runner;
    }
    @Override
    public void run() {
        runner.first();
    }
}

public class RunnerSecondAction implements Runnable {
    private Runner runner;
    public RunnerSecondAction(Runner runner) {
        this.runner = runner;
    }
    @Override
    public void run() {
        runner.second();
    }
}


public class Main{

    static Runner r1 =new Runner();
    public static void main(String[] args) {
        Thread t1 = new Thread (new RunnerFirstAction(runner));
        Thread t2 = new Thread (new RunnerSecondAction(runner));
        //....
    }
}

您已经在传递一个实现
Runnable
的对象,尽管它是一个匿名类

没有什么能阻止你把它拉到一个“命名”的类中,例如

public class RunnerFirstAction implements Runnable {
    private Runner runner;
    public RunnerFirstAction(Runner runner) {
        this.runner = runner;
    }
    @Override
    public void run() {
        runner.first();
    }
}

public class RunnerSecondAction implements Runnable {
    private Runner runner;
    public RunnerSecondAction(Runner runner) {
        this.runner = runner;
    }
    @Override
    public void run() {
        runner.second();
    }
}


public class Main{

    static Runner r1 =new Runner();
    public static void main(String[] args) {
        Thread t1 = new Thread (new RunnerFirstAction(runner));
        Thread t2 = new Thread (new RunnerSecondAction(runner));
        //....
    }
}


class foorunable实现Runnable{@Override public void run(){…}。。。新线程(newfoorunable())是,但这是在两个不同线程中同时运行的两个方法。所以我很困惑,如果你想让某个类实现一个像Runnable这样的接口,你只需要添加implements关键字,后跟接口名,就像Adrian Shum已经向你展示的那样,然后你需要实现接口方法。您的类可以包含您需要的任何属性或方法,这不是问题。@Optimuskck我不知道您的具体情况,但另一种方法是直接扩展Thread类。将“Runnable”视为“Action”。假设您有两个操作(调用
runner.firstThread()
runner.secondThread()
),您可以为这两个操作创建两个类,并将每个操作的实例传递给一个线程…
class foorunable implements Runnable{@Override public void run(){…}。。。新线程(newfoorunable())是,但这是在两个不同线程中同时运行的两个方法。所以我很困惑,如果你想让某个类实现一个像Runnable这样的接口,你只需要添加implements关键字,后跟接口名,就像Adrian Shum已经向你展示的那样,然后你需要实现接口方法。您的类可以包含您需要的任何属性或方法,这不是问题。@Optimuskck我不知道您的具体情况,但另一种方法是直接扩展Thread类。将“Runnable”视为“Action”。假设您有两个操作(调用
runner.firstThread()
runner.secondThread()
),您可以为这两个操作创建两个类,并将每个操作的实例传递给一个线程…非常感谢。我明白了您的想法。但这意味着我必须创建3个类,然后告诉我你所说的:“……希望在类声明中实现可运行接口……”。你想要类声明(如引用的评论中所述),但你不想要类声明(如你在这个答案中的评论)?我确实想要它在类声明中。但是我们不能只有两节课吗?这就是我困惑的地方,你可以在
Runnable
类中做任何事情,有很多方法可以做,你可以在它的构造函数中传递一个额外的参数来决定调用哪个方法,你可以使用lambda,你可以传递通过反射得到的
方法,等等,这是你自己的选择。但是,你到底有什么问题?你不能清楚地告诉我们你想在现实中解决什么问题吗?对我来说,这听起来是个X-Y问题,我只是在学习。谢谢你的回答。通过你的评论和回答,我能够理解:)非常感谢。我明白了你的想法。但这意味着我必须创建3个类,然后告诉我你所说的:“……希望在类声明中实现可运行接口……”。你想要类声明(如引用的评论中所述),但你不想要类声明(如你在这个答案中的评论)?我确实想要它在类声明中。但是我们不能只有两节课吗?这就是我困惑的地方,你可以在
Runnable
类中做任何事情,有很多方法可以做,你可以在它的构造函数中传递一个额外的参数来决定调用哪个方法,你可以使用lambda,你可以传递通过反射得到的
方法,等等,这是你自己的选择。但是,你到底有什么问题?你不能清楚地告诉我们你想在现实中解决什么问题吗?对我来说,这听起来是个X-Y问题,我只是在学习。谢谢你的回答。通过你的评论和回答,我能够理解:)