[マルチスレッド]プロジェクトの戦闘マルチスレッディング

免責事項:この記事はブロガーオリジナル記事ですが、許可ブロガーなく再生してはなりません。https://blog.csdn.net/wrs120/article/details/90634863

  需要はこれです:最近、学校の試験に関連するプロジェクトをやって、いくつかの専門分野の担任教師とすることができる、各専門分野のクラスのいくつかがある(これはテストであるため)、試験の後、生徒は先生が紙を印刷したい答えますそのバッチ印刷用紙に関連し、そして圧縮されたパッケージとして標識これらの論文をダウンロードし、この機能は、マルチスレッドで使用され

1.なぜ、マルチスレッドを使用します

  CPUリソースをフルに活用します

2.複数のスレッドを使用して

  1. 高い並行性:システムは、マルチスレッドを介して達成することが、高い同時マルチユーザ・マルチ要求を達成受け付けます。
  2. 大きなバックグラウンド処理タスクをスレッド:リニアプログラムが実行されます。プログラムでは、次の実行を継続するために、メインプログラムを待つ必要があること、に対処するために多くの時間を過ごすためにタスクを実行する場合。そのユーザーはそれが実行を終了するのを待たなければなりません。バックグラウンド処理でのスレッドは、メインプログラムが実行を続けることができたときに、ユーザーが待つ必要がないように、今回は、スレッドのスレッド処理タスクを開くために多くの時間を過ごすことができます。実行スレッド後にコールバック関数を実行します。
  3. ビッグタスク:時間のかかる作業と大したこと、あなたは(例:一部のアップロード)プロセスをスピードアップするために並行して複数のスレッドを再生することができ、この時間。例えば、forループを扱う多くの時間を過ごすために、あなたはマルチスレッドを考慮することができます

3.マルチスレッドコーディングプロジェクトの戦闘

私はこの機能のために使用される知識についてお話しましょう:

  1. スレッドプール
  2. スレッド
  3. たCountDownLatch
//1.CountDownLatch,计数
CountDownLatch doneSignal = new CountDownLatch(1000);

//2.创建线程池来存放线程,以防考生数量太多创建太多线程,占用过多资源
ThreadPoolExecutor executor = new ThreadPoolExecutor(50, 150, 60000, TimeUnit.MILLISECONDS, new LinkedBlockingDeque<>());

for (ExaminationModel examineeModel : notExamStudentInfo) {
	。。。。。。
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
           。。。。。。打印试卷的逻辑
            } finally {             
            	// 每执行完一个线程,数量减1      
                doneSignal.countDown();
            }
        }
    });
    //3. 将任务添加到线程池
    executor.execute(thread);
}

//  4. 为了让所有的试卷都生成之后再执行压缩以及删除PDF文件,所以需要让主线程等待子线程执行完之后再执行await
try {
	// 主线程等待
    doneSignal.await();
    System.out.println("线程运行时间:" + (System.currentTimeMillis() - startTime) + "ms");
} catch (InterruptedException e) {
    log.error(e.getMessage(), e);
}

//5. 关闭线程池(所有线程执行完关闭线程池)
executor.shutdown();

// 6. 将所有试卷打包zip
boolean flag = fileToZip();

アイデアの実現:
  スレッドプールを作成し、ロックカウンタをスレッド、すべての紙のコピーを印刷するには、スレッドプールにミッションを追加し、実行をスレッドになる作業です、ジッパーのすべての書類が印刷されている、すべての論文

説明するための知識ポイント:

  1. スレッドはの形成によって引き起こされる過度の、前後スレッド切り替え、その結果、損失を防ぐためにので、スレッドプールを使用する理由
  2. たCountDownLatchは:その役割は、すべての子スレッドを実行するために、紙を生成するまで待機するすべての書類、zipアーカイブなので、メインスレッドを置くために使用され、他のスレッドを待っている1つのまたはNのスレッドが実行を完了できるようにすることですパッキングを終了するには、たCountDownLatchのawait()とカウントダウン()メソッドを使用して、たCountDownLatchの詳細を説明するために、以下を参照してください。https://www.cnblogs.com/skywang12345/p/3533887.html
  3. ので、私は、このコアスレッドが50あり、最大150件のスレッド、複数のコンピュータのCPU性能の設定、印刷キュータ・スレッドの数、スレッド数は、しかし、50歳以上となっているが作成したタスクキューはLinkedBlockingDeque、サイズはInteger.MAX_VALUE(整数を使用して.MAX_VALUE = 7FFFFFFF(16進数)が2147483647(10進数)=)、タスクキューが満杯でない持って、詳細については、具体的な理由から、以下を参照してください。https://mp.csdn.net/mdeditor/90082697#

4.なぜ参加しません()

発生する可能性があり参加()の問題を使用します。

  1. 参加全データがパックされていないように()は、事前に、後でコードで完了することができます
  2. (下位の呼び出しが待機しているため)()システムが例外をスローするように参加()プロセスでは、あなたがプログラムを聞かせする必要がない場合は、すべての種類の異常を判定判断しない、より多くのトラブルを中断することができます

おすすめ

転載: blog.csdn.net/wrs120/article/details/90634863