Вызов нескольких методов в своих потоках - PullRequest
0 голосов
/ 31 октября 2018

Итак, у меня есть 3 метода: walk(), jog() и run(). Я хочу запускать каждый метод в отдельных потоках. Большинство вопросов, подобных этому, говорят о том, что код / ​​метод относится к категории public void run(), но я хочу, чтобы одновременно использовался только один метод. Есть ли способ сделать это, не помещая их все под public void run()?

Ответы [ 4 ]

0 голосов
/ 31 октября 2018

Вот пример класса упражнений, использующего (старый) класс Thread для ходьбы, пробежки или бега с использованием различных методов. Все три выполняются в разных потоках, создавая новый экземпляр класса для каждого типа упражнения

public class Excercise implements Runnable {
  enum ExcerciseType {
    WALKING,
    JOGGING,
    RUNNING
  };

  private final ExcerciseType excerciseType;
  public Thread thread;

  public Excercise(ExcerciseType type) {
    excerciseType = type;
  }

  public void start() {
    thread = new Thread(this);
    thread.start();
  }

  @Override
  public void run() {
    try {
      switch (excerciseType) {
        case WALKING:
          walk();
          break;
        case JOGGING:
          jog();
          break;
        default:
          running();
          break;
      } 
    } catch (InterruptedException e) {
      return;
    }
  }

  public void walk() throws InterruptedException {
    System.out.println("Started walking");
    Thread.sleep(3000);
    System.out.println("Done walking");
  }

  public void jog() throws InterruptedException {
    System.out.println("Started jogging");
    Thread.sleep(2000);
    System.out.println("Done jogging");
  }

  public void running() throws InterruptedException {
    System.out.println("Started running");
    Thread.sleep(1000);
    System.out.println("Done running");
  }

  public static void main(String[] args) {
    Excercise e1 = new Excercise(ExcerciseType.WALKING);
    e1.start();

    Excercise e2 = new Excercise(ExcerciseType.JOGGING);
    e2.start();

    Excercise e3 = new Excercise(ExcerciseType.RUNNING);
    e3.start();
  }
}
0 голосов
/ 31 октября 2018

Если вы еще не знаете, что такое лямбда-выражения (как вы сказали, что вы новичок), вы также можете создать экземпляр объекта Thread и затем делать все, что вы хотите, в методе run каждого объекта. Например:

Thread walk = new Thread() {
    public void run() {
        System.out.println("walking");
    }
};
walk.start();
0 голосов
/ 31 октября 2018

Класс Thread старый; начиная с Java 7 классы в java.util.concurrent являются предпочтительными.

ExecutorService executor = Executors.newFixedThreadPool(3);
List<Future<?>> result = executor.invokeAll(Arrays.asList(
                                 ()->walk(),
                                 ()->jog(),
                                 ()->run()));
executor.shutdown();
executor.awaitTermination(1, TimeUnit.HOURS);
0 голосов
/ 31 октября 2018

Если вы используете Java8 +, вы можете использовать лямбда-выражения:

Thread t1 = new Thread(() -> walk());
Thread t2 = new Thread(() -> jog());
Thread t3 = new Thread(() -> run());

И, кроме того, вы можете заменить их ссылками на методы

Thread t1 = new Thread(this::walk);
Thread t2 = new Thread(this::jog);
Thread t3 = new Thread(this::run);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...