2011-04-30 3 views
0

다중 스레드 뱅크를 실행할 코드를 작성하고 있습니다. 먼저 한 프로그램으로 스레드 배열을 만든 다음 루프를 실행하는 다른 스레드로 전달하여 스레드를 시작합니다. 응용 프로그램의 일부에서는 기본적으로 서로 다른 일련의 루프를 실행하는 CPU 집약적 인 방법을 사용합니다. 단지 문제가 무엇인가에 따라 그것이 내가해야한다고 생각하는 길을 열어주지 못한다. 나는 계속 주요 방법을 허용, 그것은 항복 할 것을Java Thread Yielding/Starvation Problem

public void run(){ 
    System.out.println("running jumbler"); 
    Thread.yield(); 
    Thread.currentThread().yield(); 
    try{ 
     Thread.currentThread().sleep(5000); 
    }catch(InterruptedException e){} 
    //this.setPriority(MIN_PRIORITY); 
    System.out.println("still running."); 
    Thread.yield(); 
    nums = new int[1000]; 
    int i = 0; 

    do{ 
     Thread.yield(); 

     for(int x=0;x<1000;x++){ 
      Thread.yield(); 
      //System.out.println("in the loop"); 
      nums[x]=(int)(Math.random()*10000)+1; 
      for(int y = 0;y<1000;y++){ 
       Thread.yield(); 
       //System.out.println("in the the loop"); 
       for(int z = 0;z<100;z++){ 
        Thread.yield(); 
       } 
      } 
     } 
     Thread.yield(); 
     i++; 
     System.out.println(whichJumble + ": " + i); 
    }while(i<1000); 
} 

그래서, 문제가 :

public void run(){ 
    this.setPriority(MAX_PRIORITY); 
    int count = 0; 

    while(count<transactions.length){ 
     int copy = count; 
      if(transactions[copy] instanceof Jumbler){ 
       System.out.println(copy + " is a jumbler."); 
      } 
      else{ 
       System.out.println(copy + " is not a jumbler"); 
      } 
     transactions[copy].run(); 
     count++; 
    } 

    } 

여기 그런 다음 Jumbler 실행 방법 다음은 스레드를 실행하는 코드는 더 많은 스레드를 실행하지만, 블록을 잡아서 Jumbler가 완료 될 때까지 대기합니다 (시간이 오래 걸림). 그게 왜 일어날 지, 어떻게 고쳐야하는지 어떤 생각?

+0

가 항복 방법은 스레드가 실제로 CPU를 얻을 것이라는 보장을하지 않으며, 당신은 1 밀리 초 잠을 사용하거나 낮은 우선 순위로 쓰레드를 생성 더 나을 것입니다. –

답변

-1

일단 스레드가 실행 중이면 setPriority를 ​​호출 할 때 우선 순위가 변경되는 것을 보장 할 수 없다고 생각합니다.

이 두 문장

같은 일을 수행

Thread.yield(); 
Thread.currentThread().yield(); 

을하지만 당신은 아마, 수율을 호출 할 OS가 그렇게 못하게해야한다. 당신이 스레드는 호출 할 필요가 (동시에 현재의 thread로) 실행을 시작하려면

1

당신이 제대로 스레드를 산란하고 있다는 것

(사실, 당신은 전혀 산란하지 않는) 그 스레드 객체의 start() 메쏘드는 그렇지 않습니다. 내가 제대로 코드를 이해한다면

, 당신은 첫 번째 조각이 다른 스레드를 생성하고 싶습니다. 따라서 transactions[copy].run()transactions[copy].start()으로 변경해야합니다.

(이 추측 당신이 transaction 배열의 정의를 보여 있다면 좋을 텐데..)

다음 실행 여러 스레드의 전형적인 구조이다 :

class MyThread extends Thread { 
    public void run() { 
    // Do something here ... 
    } 
} 


// Prepare the array 
MyThread[] arr = new MyThread[10]; 
for(int i = 0; i < arr.length; ++i) 
    arr[i] = new MyThread(); 

... 

// Launch the threads 
for(int i = 0; i < arr.length; ++i) 
    arr[i].start(); 
6

나는 가정이 문제가되어가 메인 루프에 transactions[copy].run();이 표시됩니다. 이 메서드는 run 메서드를 직접 호출하지만 다른 시스템 스레드에서는 호출하지 않습니다. 대신 transactions[copy].start();으로 스레드를 시작하십시오.