2014-12-18 1 views
1

이것은 처음으로이 웹 사이트를 사용하는 것입니다 ... 제가 잘못 생각한 경우 알려주십시오.Java 멀티 소프트웨어 스레딩은 항상 메인 스레드를 사용합니다

Verk3a 클래스 :

package verk3a; 

public class Verk3a { 

    public static int n = 100; 

    public static void main(String[] args) { 

     RunMeSumThread Zack = new RunMeSumThread(n); 
     RunMeSumThread John = new RunMeSumThread(n); 
     RunMeSumThread Konni = new RunMeSumThread(n); 

     Zack.start(); 
     John.start(); 
     Konni.start(); 
    } 

} 

RunMeSumThread 클래스

package verk3a; 

public class RunMeSumThread extends Thread implements Runnable{ 

    public RunMeSumThread(int n) { 
     for (int i = 0; i < n; i++) { 
      System.out.print(i); 
      System.out.print(" | "); 
      System.out.print(Thread.currentThread().getName()); 
      System.out.println(); 
     } 
    } 
} 

그리고 항상이 반환

0 | main 
1 | main 
2 | main 
3 | main 
4 | main 
5 | main 
6 | main 

등 ... 난

동시에 여러 스레드를 실행하려고합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+2

당신은 println 메소드를 실행하는() 문 생성자에서. 생성자는 주 스레드에서 실행 중입니다. –

답변

0

Thread의 슈퍼 생성자에 Runnable의 구현을 통과해야 :

public class RunMeSumThread extends Thread 
{ 
    public RunMeSumThread(final int n) 
    { 
     super(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       for (int i = 0; i < n; i++) 
       { 
        System.out.print(i); 
        System.out.print(" | "); 
        System.out.print(Thread.currentThread().getName()); 
        System.out.println(); 
       } 
      } 
     }); 
    } 
} 
+0

내 주여, 이것이 효과가있었습니다. 그뿐만 아니라, 선생님이 저에게 가르치 려던 코드처럼 보입니다 ... 저를 잘못 이해하지 마세요 ... 이번 학기에 실패했고 다음 학기 동안 저의 약점을 잡으려고합니다 ... 스레딩 ... 배우고 싶지만 더 많은 시간이 필요했습니다 : " 고마워요, smooch :" –

5

void run 메서드에서 스레드에 의해 실행될 코드를 구현해야합니다. 논리를 클래스 생성자에서 run 메서드로 옮기면됩니다. 다음은 예입니다 :

public class RunMeSumThread extends Thread implements Runnable{ 

    int n; 

    public RunMeSumThread(int n) { 
     this.n = n; 
    } 

    @Override 
    public void run() { 
     for (int i = 0; i < n; i++) { 
      System.out.print(i); 
      System.out.print(" | "); 
      System.out.print(Thread.currentThread().getName()); 
      System.out.println(); 
     } 
    } 
} 

또한, 스레드 생성하는, 당신이 Thread 클래스에서 확장해야 또는 Runnable 인터페이스를 구현하기 위해서는 두 가지를 동시에 할 이상한.

Thread에서 확장하는 경우 Runnable 인터페이스를 구현할 필요가 없습니다. Runnable 만 구현하는 경우 Thread 인스턴스를 만들고 Runnable 인스턴스를 전달해야합니다. 코드에서 (코드에서 적응) :

public class RunMeSumThread implements Runnable{ 
    int n; 

    public RunMeSumThread(int n) { 
     this.n = n; 
    } 

    @Override 
    public void run() { 
     for (int i = 0; i < n; i++) { 
      System.out.print(i); 
      System.out.print(" | "); 
      System.out.print(Thread.currentThread().getName()); 
      System.out.println(); 
     } 
    } 
} 

public class Verk3a { 
    public static int n = 100; 
    public static void main(String[] args) { 
     //create a Thread and pass an instance of the class implementing Runnable here 
     Thread zack = new Thread(new RunMeSumThread(n)); 
     Thread john = new Thread(new RunMeSumThread(n)); 
     Thread konni = new Thread(new RunMeSumThread(n)); 

     zack.start(); 
     john.start(); 
     konni.start(); 
    } 
} 
+0

'Runnable'에서'run'이 인자를 취하지 않기 때문에 이것은 작동하지 않을 수 있습니다. –

+0

@JoeInner 당신 말이 맞아요. 빠른 타이핑 문제 :). 답변이 수정되었습니다. –

3

당신이 스레드의 start 방법을 호출 할 때까지 정말 (OS 수준에서)이 생성되지 않은 새로운 "스레드". 생성자에서 인쇄 중이므로 항상 주 스레드에서 실행됩니다.

0

당신은 Constructor에 그 지문을 추가했습니다.

 System.out.print(i); 
     System.out.print(" | "); 
     System.out.print(Thread.currentThread().getName()); 
     System.out.println(); 

그래서 개체를 만드는 동안 출력이 인쇄됩니다.

: 당신이 방법 start를 호출 할 때까지의 간단한 자바 객체

관련 문제