在不同的线程上执行两个不同的接口实现

时间:2017-02-27 20:07:52

标签: java multithreading future runnable callable

我有一个界面说VegetableCreation,方法是:

public void writeVeggieDataIntoFile();

以及两个名为AppleMango的不同类,它们实现VegetableCreation

并且工厂类VegetableFactory采用create()方法:

public class VegetableFactory {
    public VegetableCreation create(String arg0) {

        if (arg0.equals("Apple"))
           return new Apple();
        else if (arg0.equals("Mango")
           return new Mango();
        else {
           // create and return both apple and mango by spawning two different threads
           // so that the writeVeggieDataIntoFile();  gets invoked concurrently
           // for both apple and mango and two different file is created
        }
    }
}

我在此基本上要尝试实现的是当我从客户端类VegetableFactory方法调用create()main()方法时并传递除"Apple""Mango"以外的任何字符串值作为运行时参数。我希望两个不同的线程可以处理每个AppleMango对象,并在每个writeVeggieDataIntoFile()方法上同时工作。

任何关于设计策略的建议/或使用哪些并发API等都将受到高度赞赏。

P.S。:我应该称它为水果**而不是蔬菜*

3 个答案:

答案 0 :(得分:1)

查看Composite模式,然后构建一个CompositeVegetable,当被告知"做它的事情"启动两个线程,一个执行一个操作,另一个执行另一个操作。

public class BothVegetable implements Vegetable {
    public void writeVeggieDataInfoFile() {
        Thread thread1 = new Thread(new AppleRunnable());
        Thread thread2 = new Thread(new MangoRunnable());
        thread1.start();
        thread2.start();
        thread1.join();
        thread2.join();
    }
}

// and in your factory

    return new CompositeVegetable();

PS。你的蔬菜看起来像水果!

答案 1 :(得分:0)

我希望从名为Vegetable / Fruit的工厂获得VegetableFactory / FruitFactory,而不是VegetableCreation / FruitCreation

我会避免在工厂方法中创建线程和文件作为副作用。

我还要将writeFruitDataIntoFile()重命名/更改为write(Writer out),因为您写的内容由封闭的接口或类告知,并且您写入的位置由其方法参数告知。

如果您确实需要并发处理,请在write(...)中创建一个主题并让工厂方法只返回Fruit

优点是:

  • 必须记录对象创建时的副作用。
  • 线程仅按需创建(如果调用write()),而不是每创建Fruit个对象。
  • 您不需要额外的课程。
  • 每个了解工厂设计模式的人都能清楚了解这是一个干净的实施。

请参阅:

为了好的OO练习,我使用了一个界面:

interface Fruit {

  void write(Writer out);

  ...
}  // Fruit

它的抽象实现:

public abstract class AbstractFruit implements Fruit {

  Data data;

  public void write(Writer out) {
    ...
  }

  ...
}  // AbstractFruit

public classe Apple extends AbstractFruit implements Fruit {
  ...
}

public classe Mango extends AbstractFruit implements Fruit {
  ...
}

并且为了type safety我会使用特定的get...()方法(通常是done in the Java API):

public class FruitFactory {

  public static Fruit getApple() {
     Fruit a = new Apple()
     ...
     return a;
  }

  public static Fruit getMango() {
     Fruit m = new Mango()
     ...
     return m;
  }
}  // FruitFactory

enum

interface Fruit {

  enum Type {
    APPLE,
    MANGO 
  }

  void write(Writer out);

  ...
}  // Fruit

public class FruitFactory {

  public static Fruit get(Fruit.Type fruitType) {

     switch (fruitType) {
        case Fruit.Type.APPLE:
          Fruit a = new Apple()
          ...
          return a;
          break;
        case Fruit.Type.MANGO:
          Fruit m = new Mango()
          ...
          return m;
          break;
        default:
          throw new FruitTypeNotSupported/* Runtime, i.e. unchecked */Exception();
          break; 
     }
  }  // get(...)
}  // FruitFactory

请参阅RuntimeException的API文档:

  

不需要在方法[...] throws子句

中声明未经检查的异常

答案 2 :(得分:-1)

首先,我会让你的工厂有静态创建。然后在create do item instanceof Fruit中创建fruit线程。否则如果项目instanceof蔬菜然后做菜线。