代码之家  ›  专栏  ›  技术社区  ›  Raj

扩展线程优先于实现Runnable的场景?[副本]

  •  11
  • Raj  · 技术社区  · 11 年前

    作为一个初学者,我正在阅读Java中实现多线程的两种方法。

    我读过这个 thread 在SO和许多其他线程上。

    声明如下:

    “更喜欢可运行”,仅当您专门研究线程的行为时才扩展线程。

    有人能通过给我提供一小段帮助我理解这一行的代码片段来解释专门化线程行为的含义吗。

    5 回复  |  直到 4 年前
        1
  •  12
  •   skiwi    11 年前

    您应该扩展 Thread 就像扩展其他库类一样多。

    拿一个 List 例如,更具体地说 ArrayList 能够 在其上添加额外的行为,例如,如果某个谓词失败,则在添加时拒绝值。
    那你可以称之为 PredicatedArrayList .

    你是否想延长 阵列列表 不管是否如此,但这场辩论不适合这个问题。

    因此,扩展线程的一个例子是在特定时间后终止自己的线程。那你会有 SuicidingThread extends Thread ,这可能会让构造函数占用时间。

    这甚至强化了你应该把你的实际任务放在 Runnable .
    喜欢 Runnable somethingRunnable = new SomeClass(); 哪里 SomeClass implements Runnable .

    现在您可以执行以下任一操作:

    • Thread someThread = new Thread(somethingRunnable);
    • Thread someThread = new SuicidingThread(somethingRunnable, 5, TimeUnit.DAYS);

    所以这将是一个扩展线程的用例。

        2
  •  2
  •   hanish.kh    11 年前

    专业化意味着扩展现有线程类的功能。它可以是任何东西,具体取决于应用要求。我在下面提到的这个逻辑上可能不正确。

    public class MyThread extends Thread{
    @Override
    public void interrupt() {
        if(thread has started some operation on database){
            //roll back transaction
        }
        super.interrupt();
    }
    }
    

    在这里,在中断线程之前,我们可以检查当前是否有任何数据库操作正在运行并回滚它。虽然可以从中断的catch块进行操作,但如果您在应用程序的不同位置创建此线程的大量实例,则从扩展类处理它可以减少行数。这只是一个例子,没有人会这样使用。:)

        3
  •  0
  •   tianwei    11 年前

    因为java不支持多重继承。 如果您有一个名为Person的类。

    class Person{
     String name;
     int age;
    }
    

    然后您要创建一个类Man,该类扩展Person

    class Man extends Person{
    
    }
    

    现在您已经使用extends关键字来声明Man是Person。如果你想 Man 要像线程一样执行,不能扩展 Thread 同样是因为Java不支持多继承。所以只使用 Runnable 可以与其他接口一起实现的接口。

    class Man extends Person implements Runnable{
      public void run()[
      }
    }
    

    编辑: “仅当你专门研究线程的行为时才扩展线程”意味着你的类只是一个没有其他特性的线程,因为当你的类包含其他特性时,你需要扩展其他超类,而不是扩展 线 正如我之前提到的,java不支持多重继承,所以只有当你专门研究线程的行为时才扩展线程。

        4
  •  0
  •   eatSleepCode Dawood ibn Kareem    11 年前

    Java不支持多重继承,这意味着您只能在Java中扩展一个类,因此一旦扩展 Thread 类,您失去了机会,无法在Java中扩展或继承另一个类,因此该类仅适用于线程。

    通过 extending Thread ,每个线程都有一个与其关联的唯一对象,而实现 Runnable ,许多线程可以共享同一个可运行实例。

    扩展类通常意味着添加新功能、修改或改进行为。如果我们不在 线 然后使用 可运行的 接口。

    当您想要对线程类进行一些修改时,线程类的某些行为由JDK开发人员决定,然后可以使用 线 类并对其进行修改。

        5
  •  0
  •   Ion Cojocaru    11 年前

    首选Runnable实现而不是线程扩展有几个原因:

    • 总是倾向于组合而不是继承,这样你最终会得到较少耦合的代码。 决定类与线程的关系的一种方法是检查“是”与“有”的关系。

    • 实际上,扩展线程将迫使您为每个线程创建类的新实例实例,而不是在Runnable的情况下共享同一实例。看见 this .

    • Java仅支持单一继承

    扩展Thread的一个合法用例示例是,当您需要设计一个包含自定义财产(例如:缓存资源)的Thread类时,该类是CachedThreadPool的一部分