2014-11-13 3 views
0

나는 음식을 만들고 새로운 실을 시작하는 음식을 가지고있다. 다른 것들 사이.스레드와 Java의 ArrayList

private Thread foodThread; 
public void start() { 
    foodThread = new Thread(this, "Food");  
    foodThread.start(); 
} 

나는 음식의 방법을 사용하는 ArrayList의 뷔페가있는 보드 클래스가 있습니다.

ArrayList<Food> buffet; 
for (int i=0; i<15; i++){ 
     buffet.add(new Food(this)); 

    } 

이제 내가 원하는 것은 for 루프 내부에서 Food 클래스의 새 스레드를 시작하는 것입니다 (foodThread). 내가

public Food food; 

루프 내부에 다음

food.start(); 

을 시도했지만 그것이 작동하지 않는 것, 그냥

+0

문제를 재현 할 수있는 코드 (적어도 스택 추적 코드 포함)를 게시하십시오. – Fildor

+0

각 음식에 대한 실을 원하십니까? 쓰레드는 복잡하고 복잡한 것들이며, 이들을 올바르게 사용하는 복잡성은 특정 애플리케이션에 대한 동시 실행의 이점에 의해 상쇄되어야합니다. 아마도 분자 수준에서 생물학적 붕괴를 시뮬레이션하지 않는 한 "음식"객체가 수행 할 수있는 일은 동시성의 수준을 요구할 수 있습니다. 그러나 스레드를 사용하여 실습을하기 만하면 충분합니다. – Boann

답변

2

코드에이 코드가있는 경우 :

public Food food; // <- Here you only declare a variable "food" of Type "Food" 
        // No object (of Type Food) instance has been created, yet! 
food.start();  // <- Will throw NPE 

이렇게하면 음식 개체를 인스턴스화해야합니다.

처럼 ... NPE의

public Food food = new Food(); 
food.start(); 

또 다른 가능한 소스는 ... 미래의 질문을 그냥 힌트

@subash의 대답입니다 : 스택 트레이스에서 (오류 메시지가 NullPointerException을 보았을 때) 행 번호와 패키지/클래스가 언급되어야합니다. 따라서 NPE의 경우 특히 객체를 인스턴스화하는 것을 잊어 버린 곳을 추적 할 수 있어야합니다.

UPDATE

이에

for (int i=0; i<15; i++){ 
    buffet.add(new Food(this)); 
} 

변경 한 경우 :

for (int i=0; i<15; i++){ 
    Food localFood = new Food(this); // Create instance, variable is only valid and visible inside this block. 
    buffet.add(localFood);   // Add the instance to your buffet. 
    localFood.start();    // Start the instance's thread. 
}         // Next, please. 

당신의 의도를해야합니다.

시드 : 인터페이스에 대해 코딩해야합니다. 즉, 더 나은 것을 의미합니다.

List<Food> buffet = new ArrayList<Food>(); 
// ^-Interface "List" ^- Concrete implementation of the interface. Easily exchangeable for other implementation later on. 
+0

공개하지 않고 다른 클래스의 스레드를 하나의 클래스로 호출하는 다른 방법이 있습니까? Food food = new Food(); food.start(); – user3470812

+0

@ user3470812 정확히 "** 전화 ** 스레드"를 의미합니까? 스레드를 만들고 시작하는 방법은 여러 가지가 있습니다. 스레드 확장, Runnable 구현, Executors 사용 ... – Fildor

+0

게시판 클래스 내에서 foodThread 스레드를 공개 푸드 푸드없이 시작하십시오. – user3470812

1

는 ArrayList를 초기화 error.java.lang.NullPointerException을 던졌습니다

ArrayList<Food> buffet = new ArrayList<Food>(); 
관련 문제