2016-03-07 2 views
0

Я хочу набор объектов, которые наследуются от Thread; каждый объект работает в своем потоке.A Тема как объект Java

Я попробовал extends Thread и позвонил super(), думая, что обеспечит создание нового потока; но нет ... только main это работает нить :(

Все говорят мне, «реализовать Runnable поставить код, который вы хотите в run() и поместить его в токарно-объект». Я не могу это сделать из-за 2-причины:

  1. Моих коллекция-элементы не-типа Thread, и если я полиморфировать мне придется изменить все эти зависимости

  2. run() не может содержать весь класс.. .. правый?

Так что я хочу знать, во-первых, если что-то, что я хочу сделать, возможно даже и во-вторых, если да, то как это сделать?

+0

С возвращением Оливье10178. run() может содержать внутренний класс. –

+0

Не могли бы вы предоставить дополнительную информацию? Конечно, вы могли бы просто продлить Thread? Затем вам нужно вызвать Thread.start(), чтобы они запускались. – starf

+0

Обычно вам следует избегать расширения «Thread». Что вы пытаетесь достичь? Почему вы не можете просто передать «Runnable' to 'Thread»? – SLaks

ответ

1

super() просто вызывает родительский конструктор (в вашем случае используется конструктор по умолчанию Thread). Метод для запуска нового потока - start(). Как говорили другие, это плохой дизайн для расширения Thread.

Да, вы можете создать класс, который реализует Runnable

class MySpecialThread implements Runnable { 
    public void run() { 
     // Do something 
    } 
} 

и вы можете запустить его в новом потоке, как это:

Thread t = new Thread(new MySpecialThread()); 
// Add it to a collection, track it etc. 
t.start(); // starts the new thread 

1- Вы можете использовать коллекции RunnablesИЛИ коллекции Thread с использованием приведенного ниже примера.

MySpecialThread m = new MySpecialThread(); 
List<Runnable> runnables = new ArrayList<Runnable>(); 
runnables.add(m); 
List<Thread> threads = new ArrayList<Thread>(); 
threads.add(new Thread(m)); 

2- Способ не может содержать класс, но приведенный выше пример MySpecialThread это класс, который ведет себя, как и любой другой класс. Вы можете написать конструктор, добавить методы и поля, и т.д.

+0

Так что мне нужен отдельный список, чтобы содержать Threads - это то, что вы говорите. У меня не может быть только 1 список, где объект эквивалентен потоку? – Olivier10178

+0

Я просто сказал, что вы можете выбрать. Если вам нужен список объектов «Thread», вам не нужен список «Runnable's». Я просто показывал, что возможен любой вариант. – Samuel

+0

Если у меня есть только список Runnables; как же начать темы? – Olivier10178

0

Я рекомендую использовать ExecutorService

Давайте пример кода на использование ExecutorService

import java.util.*; 
import java.util.concurrent.*; 

public class ExecutorServiceDemo { 

    public static void main(String args[]){ 
     ExecutorService executor = Executors.newFixedThreadPool(10); 
     List<Future<Integer>> list = new ArrayList<Future<Integer>>(); 

     for(int i=0; i< 10; i++){ 
      CallableTask callable = new CallableTask(i+1); 
      Future<Integer> future = executor.submit(callable); 
      list.add(future); 
     } 
     for(Future<Integer> fut : list){ 
      try { 
       System.out.println(fut.get()); 
      } catch (InterruptedException | ExecutionException e) { 
       e.printStackTrace(); 
      } 
     } 
     executor.shutdown(); 
    } 
} 

class CallableTask implements Callable<Integer>{ 
    private int id = 0; 
    public CallableTask(int id){ 
     this.id = id; 
    } 
    public Integer call(){ 
     // Add your business logic 
     return Integer.valueOf(id); 
    } 
} 

выход:

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

Если вы хотите использовать Thread вместо ExecutorService, ниже код должен работать на вас.

import java.util.*; 

class MyRunnable implements Runnable{ 
    private int id = 0; 
    public MyRunnable(int id){ 
     this.id = id; 
    } 
    public void run(){ 
     // Add your business logic 
     System.out.println("ID:"+id); 
    } 
} 
public class RunnableList{ 
    public static void main(String args[]){ 
     List<Thread> list = new ArrayList<Thread>(); 
     for (int i=0; i<10; i++){ 
      Thread t = new Thread(new MyRunnable(i+1)); 
      list.add(t); 
      t.start(); 
     } 
    } 
} 
+0

Почему RunnableList ?? – Olivier10178