来自具有多个参数的构造函数的类的线程

时间:2011-01-20 14:50:04

标签: java multithreading

在这里遇到问题,我一直在学习java中的线程我理解如果你正在扩展一个线程,你将在main中创建一个线程,如下所示。

Card thread1 = new Card("Ace");

这将来自一个名为带有构造函数的线程的类

public thread(String n);

但是我给了构造函数一个多参数:

 public Person(int PersonID, Direction direction, StairLock stairLock)

并且要求为4个人中的每个人创建一个线程,其中两个人上升,2个人下楼和锁定楼梯,我不确定如何做到这一点任何帮助或方向都会有所帮助

3 个答案:

答案 0 :(得分:6)

您的问题存在多个问题。

  • 任何扩展线程的类在其构造函数中都可以调用super(String)将线程名称传递给超类线程。因此,在Person的构造函数中,您可以立即使用您想要的线程名称为Thread调用此构造函数。总是将线程命名为调试标识是一种很好的做法。
  • 您引用了课程thread,但您应该知道这与Thread不同。 Java中的类应始终以大写字母开头。如果你创建了自己的thread课程,那么你实际上并没有创建一个主题。
  • 我不确定为什么CardPerson类需要扩展Thread。除非您只是为此示例选择随机名称,否则这些类听起来更像是数据对象而不是线程。如果是这种情况,您可能需要考虑让一个单独的类成为处理楼梯上下移动的Thread,并为每个线程提供自己的Person类实例来处理。

鉴于所有这些,如果要求您为每个Person创建一个线程来处理其移动,我建议您从Person创建一个单独的类来执行此操作。扩展Thread或实施Runnable并在构造函数中使用Person。这两个类都使用您必须实现的.run()方法来执行线程的工作负载。使用Thread,您可以实例化它并调用.start()。使用Runnable,您必须创建新的Thread并将Runnable作为参数传递给构造函数,然后在.start()上调用Thread。< / p>

许多人更喜欢使用Runnable方法,但结果几乎都是相同的。如果你正在处理线程,你应该熟悉这两种方法。

答案 1 :(得分:2)

Thread vs Runnable

你可能不应该扩展线程。

使用Runnable实现Runnable并启动一个新线程。

原因:如果您扩展了线程,则会干扰正在运行的基础架构代码。只有在需要改变工作方式时才应该这样做。在90%的情况下,您只需要指定需要执行的内容,而不是如何执行。这就是Runnable方法更优雅的原因:您将 分开。

来自Runnable文档:

  

在大多数情况下,Runnable接口   如果你是的话应该使用   计划覆盖run()方法   而没有其他Thread方法。这是   很重要,因为课程不应该   除非是程序员,否则应该是子类   打算修改或增强   班级的基本行为。

示例代码

尝试这样的事情:

public void startThread(final int personID,
    final Direction direction,
    final StairLock stairLock){
    new Thread(new Runnable(){

        @Override
        public void run(){
            System.out.println("Person " + personID + " runs in direction "
                + direction
                + "and I have no idea what a Stairlock is, but here it is "
                + stairLock);
        }
    }).start();

}

OOP设计

一般情况下,请注意如何为物体建模。

如果我理解你的话,卡片就是你概念中的一个主题。那是糟糕的!一张卡片可以有一个线程,但它永远不应该是一个!

在良好的OOP设计中,一个类只有一个目的,这称为Cohesion。此外,不同类型的功能应该是loosely coupled,即域类不应该包含基础结构代码。

答案 2 :(得分:1)

首先,欢迎来到学习线程的世界。当然,您可以扩展Thread,只需使用正确的签名调用构造函数。或者,您也可以实现Runnable接口。下面的两个工具(A和B)在功能方面是等效的。现在,弗洛伊德先生告诉我们不要扩展Thread。让我们探讨原因(我不同意,只是试图帮助您理解Java中的设计问题)。

类扩展是Java的继承实现,是一种基本的OO范例。当你直接扩展Thread时,你会说“我的类(Person)'是'Thread',这是完全可以接受的。大多数人不以这种方式扩展Thread的原因是Java缺乏多重继承。现在不要引用我的话,我没有统计数据支持它,也有可能他们的IDE不允许它或者主管不喜欢它。但问题出在这里:

在不辩论多重继承是好还是坏的情况下,我们可以看到它不存在并且安全地假设它不会在不久的将来存在。这意味着如果您的类扩展了Thread,它就无法扩展其他任何东西。这会让你陷入困境。但是,java允许您的类实现多个接口,而Runnable可以只是其中之一。这为您提供了更多的自由度作为对象设计器,因为您可以选择(扩展)各种完善的类来满足您的设计目标,并且仍具有多线程功能。

希望有所帮助。问候, - M.S。

// A

public class Person extends Thread {

    public Person (int PersonID, Direction direction, StairLock stairLock) {
        super();
        // Other stuff for constructor
    }

    public void run () {
        // Whatever you want to do with the thread
    }

    public static void main (String[] args) {
        for (int i = 0 ; i < names.length ; i++) {
            Person ace = new Person (names[i], xxx, xxx);
            ace.start();
        }
    }
}

/////////////////////////////////////////////// /////////////

// B

public class Person implements Runnable {

    public Person (int PersonID, Direction direction, StairLock stairLock) {
        // Other stuff for constructor
    }

    public void run () {
        // Whatever you want to do with the thread
    }

    public static void main (String[] args) {
        for (int i = 0 ; i < names.length ; i++) {
            Person ace = new Person (names[i], xxx, xxx);
            new Thread (ace).start();
        }
    }
}