2011-11-21 4 views
1

주된 방법으로 100 개의 스레드를 생성하는 응용 프로그램이 있습니다 (백 개의 계정을 시뮬레이트한다고 가정 해 봅시다). 나는 그것을 실험하고 Control-C를 사용하여 intterupted 할 때 인쇄를 종료하고 싶습니다.다중 스레드 응용 프로그램의 ShutDownHook

난 당신이 ShutDownHooks에 내가 내 주요 방법으로 다음과 같은 추가 한 할 수있는 읽기 : 나는 그것을 실행할 때 아무것도 인쇄되지됩니다

그러나
Runtime.getRuntime().addShutdownHook(new Thread() { 
      public void run() { 
          System.out.println("Terminating"); 
         } 
     }); 

.

어디서 잘못 가고 있는지 (모든 스레드는 for 루프에 선언되어 있고 start 메소드를 호출하는 것으로 시작하는) 지침을 제공해 주실 수 있습니까?

감사합니다, 조지

편집 : 코드는 아래를 참조하십시오

은행 등급 :

public class Bank { 
private final double[] accounts; 
    public Bank(int n, double initialBalance) { 
    accounts = new double[n]; 
    for (int i=0; i < accounts.length;i++) { 
     accounts[i] = initialBalance; 
    } 
} 
    public double getTotalBalance() { 
     double sum = 0.0; 
     for (int i=0; i < accounts.length; i++) { 
      sum += accounts[i]; 
     } 
     return sum; 
    } 
    public synchronized void transfer(int fa, int ta, double amt) throws InterruptedException{ 
     System.out.print(Thread.currentThread()); 
     if (accounts[fa] < amt){ 
         wait(); 
        } 
     accounts[ta] -= amt; 
     System.out.println("Transfer of amount: " + amt + " from: " + fa + " Transfer to: " + ta); 
     accounts[fa] += amt; 
     System.out.println("Total Balance: " + getTotalBalance()); 
     notifyAll(); 

} 
public int size() { 
    return accounts.length; 
} 
public double[] getAccounts(){ 
    return accounts; 
} 

} 

BankTest 등급 :

public class BankTest { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
      Bank b = new Bank(100,1000); 
    int i; 
     long timeStart = System.currentTimeMillis(); 
     long j = System.currentTimeMillis(); 





      for (i=0; i < b.size(); i++) { 
     TransferRunnable tr = new TransferRunnable(b, i, 1000,j); 
     Thread t = new Thread(tr); 
     t.start(); 

    } 
      Runtime.getRuntime().addShutdownHook(new Thread() { 
     public void run() { 
         System.out.println("Terminating"); 
        } 
    }); 


     } 


    } 

TransferRunnable 등급 :

public class TransferRunnable implements Runnable { 
private Bank b; 
private int fromAccount; 
private double maxAmount; 
private final int DELAY = 40; 
private long timeStart; 
public TransferRunnable(Bank b, int from, double max, long timems) { 
    this.b = b; 
    fromAccount = from; 
    maxAmount = max; 
     timeStart = timems; 
} 
@Override 
public void run() { 

     try { 
     while (true) { 
      int ta = (int) (b.size() * Math.random()); 
      double amount = maxAmount * Math.random(); 
        double[] acc = b.getAccounts(); 
        b.transfer(fromAccount,ta,amount); 
      Thread.sleep((int) (DELAY*Math.random())); 
     } 
    } 
     catch (InterruptedException e) { 

     } 

    } 

} 
+0

내 대답에 대한 답변에서 말했듯이 런타임 시스템의 특성을 말할 수 있습니까? –

+0

Windows 7 (JDK 1.6.0_10 – user998388

답변

0

실행하면 인쇄됩니다. 그래도 System.out.flush();을 run() 메소드의 끝에 추가 할 수 있습니다. 그러면 출력이 즉시 인쇄됩니다.

+2

) 실제로 system.out은 각 println에 대해 이미 플러시합니다. – jtahlborn

+0

JRE에서는 일반적으로 Yes입니다. 그러나 System.out 및 println에 대한 설명을 찾았으며 명시 적으로 * 자동 플러시가 필요하지 않습니다. 그리고 수신하는 "파티"가 버퍼링을하고 조기에 닫을 수 있습니다. 그래서 우리는 묻는 사람이 달리고있는 시스템을 알아야합니다. –

+0

나는 명령 프롬프트에서 Cygwin과 Windows 모두에서 그것을 시도했다. 스레드를 실행할 때 인쇄합니까? 새로운 스레드를 만들지 않고 코드를 게시하는 방법을 잘 모르겠다. – user998388

0

다른 사람들이 말했듯이, 이것은 올바르게 작동해야합니다. 어떤 OS를 사용하고 있습니까? CTRL+C은 프로세스 종료를 요구하는 대신 프로세스를 완전히 종료시킬 수 있습니다 (예 : SIGKILL 대 SIGINT). Java 프로세스를 전송하는 신호를 확인할 수 있습니까?

마지막으로, 최후의 수단으로 당신은 자바의 다음 비트를 시도 할 수 :

if (FileDescriptor.out.valid()) { 
    FileDescriptor.out.sync(); 
} 

을 나는이 비록 어떤 차이를 확인하지 않습니다 의심!

+0

아이디어가 있으십니까? Windows에서 JDK 및 넷빈을 사용하고 있습니다. – user998388

관련 문제