2017-05-16 6 views
1

JButtonを押した後、しばらくして私のプログラムのUIがフリーズします。私は、これがSwingスレッドを詰まらせるセマフォであることを発見しました。これは、セマフォのacquire()コール含む方法である:ActionPerformedからメソッドを呼び出してメインスレッドでメソッドを実行します

private void fetch(int numThreads) { 
    //some code here 
    sem = new Semaphore(numThreads); 
    for (int i = 0; i < model.getRowCount(); i++){ 
     try { 
     sem.acquire(); 
     } catch (InterruptedException e) { 
     e.printStackTrace(); 
     } 
    //some code here 
    } 

そして、ここでは、私が理解したようfetch()

concFetchButt.addActionListener(new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
    SwingUtilities.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
     switchButtonStates(false); 
     } 

    }); 

    fetch(Integer.parseInt(threadsNumField.getText())); 
    } 

への呼び出しを行う唯一の方法であるが、このコードは、上のfetch()を実行して終了しますスイングスレッドは、スイングとは何の関係もないと思われます。

私の質問は次のとおりです。Swingスレッドの代わりにプログラムのメインスレッドでSwingのActionPerformed()から呼び出されたメソッドを実行するにはどうすればよいですか?

+1

'main(string []) 'メソッドで使用されるスレッドは、アクションリスナーがアクティブになるまでに終了している可能性があります。別のスレッドを使います。これは、GUIとやりとりするのに便利なもので、 'SwingWorker'で提供されています。 –

+0

タイムリーに受け入れていただきありがとうございます。 – GhostCat

答えて

0

"メイン"スレッドで特に実行する必要はありません。単にのいずれかのスウィングUIスレッドを実行してください。そこに到達するために

最も簡単な解決策:

  • あなたのクラスにExecutorServiceのを追加するには、ExecutorServiceの

にそのRunnableを提出

  • Runnableオブジェクトにそのコードfetch(Integer.parseInt(threadsNumField.getText()));を置きます次の行に沿って:

    private final ExecutorService executorService = Executors.newSingleThreadExecutor(); 
    
    executorService.execute(new Runnable() { 
    public void run() { 
        fetch(Integer.parseInt(threadsNumField.getText())); 
    } 
    }); 
    
  • 関連する問題