3

簡単に言えば。関数が連続して実行される無限ループを含むプログラムを作成し、できるだけ速く実行する必要があります。

ただし、この関数はマイクロ秒の時間スケールで完了しますが、実行にかなり時間がかかる別のスレッドを生成する必要がありますが、前のスレッドに影響を与えてはなりません。

この例が物事を説明するのに役立つことを願っています:

while (updateGUI == true) { //So, forever until terminated

        final String tableContents = parser.readTable(location, header);
        if (tableContents.length() == 0) {//No table there, nothing to do
        } else {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
                    //updateTable updates a JTable 
                    updateTable(tableContents, TableModel);
                    TableColumnModel tcm = guiTable.getColumnModel();
                }
            });
        }
     ***New thread is needed here!
    }

したがって、readTable関数を無限回実行する必要がありますが、次に無限回実行する2番目のスレッドを開始する必要がありますが、実行する必要があるため、完了するまでにミリ秒/秒かかります一部のファイル I/O が発生し、完了するまでに少し時間がかかる場合があります。

Threadクラスを拡張し、 を使用しExecutors.newCacheThreadPoolて新しいスレッドを生成してみました。ただし、何をしてもreadTable関数の速度が低下し、データを十分に高速に読み取ることができないため、テーブルが正しく更新されません。

このループの実行方法を再設計する必要がある可能性があります。または、代わりに 2 つの新しいスレッドを開始して、それらのスレッド内に無限ループを配置することもできます。

このように設計された理由は、updateTable関数が実行されると、 a を更新するために使用される文字列を返すという事実によるものでしJTableた. GUIのテーブルが作成された場所です。

誰かに何か提案があれば、私は大いに感謝します。

ありがとう

4

4 に答える 4

3

マシンの過負荷を避けるために、細心の注意を払う必要があります。長時間実行されるタスクは、高速でなければならないスレッドから独立させる必要があります。また、同時に実行するこれらの数に上限を設ける必要があります。私は最初に1つのキャップを置きます。

また、画面は非常に高速にしか更新できず、画面の更新が非常に高速にしか表示されません。最初は、1 秒あたりの更新数を 20 に制限します。

ところで、優先度の設定は、マシンが過負荷になっている場合にのみ役立ちます。あなたの目標は、最初に過負荷にならないようにすることであり、優先順位は重要ではありません。

于 2013-10-30T10:36:39.763 に答える
3

を更新しているのでJTableSwingWorker便利です。この場合、ここで提案されているように、1 つのワーカーが別のワーカーと共存できます。

于 2013-10-30T10:31:06.050 に答える
2

ここで何が起こっているのかを推測するのは非常に困難ですが、「データを十分に高速に読み取ることができないため、テーブルが正しく更新されない」と述べました。タイミングが十分に速くないことがコードの正確性に影響することを本当に意味する場合、コードはスレッドセーフではなく、適切な同期を使用する必要があります。

スレッド実行のタイミングは標準 JVM では決定論的ではないため、正確性はタイミングに依存してはなりません。

また、スレッドの優先度をいじらないでください。あなたが非常に珍しいことをしようとしている同時実行の第一人者でない限り、これを行う必要はありません。物事が混乱したり、壊れたりする可能性があります。

于 2013-10-30T10:29:17.980 に答える
0

したがって、「無限」ループスレッドの優先度を最大にしたい場合、「最も貴重なもの」ではなく、EDT の優先度を MAX に設定するのはなぜですか?

               Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
                //updateTable updates a JTable 
                updateTable(tableContents, TableModel);
                TableColumnModel tcm = guiTable.getColumnModel();

このコードでは、現在のスレッドは EDT であるか、EDT によって生成されたスレッドになります。whileループをインターリングする前にその行を移動しないのはなぜですか?

于 2013-10-30T10:28:57.477 に答える