3

誰かがコードのサイズ変更に AsyncScalr を使用して imgscar のサンプル コードを共有できますか? 画像処理に imgscar (Scalr クラス) を使用しようとしています。これは使いやすく優れたライブラリですが、OutOfMemoryException が頻繁に発生します。AsyncScalr を使用することで、低負荷の問題が解決されることを願っています。

4

2 に答える 2

3

Java Concurrent ライブラリに精通している場合、AsyncScalr クラスの使用は非常に簡単です。新しい並行ライブラリに慣れていない場合、要点は次のとおりです。

  1. 将来の未知の時点で何らかの作業を行う API メソッドを呼び出します。メソッド呼び出しは、実際の作業をラップするFutureを返します。
  2. 元の API 呼び出しは、実際には内部で作業をキューに入れます。ビジーでない場合は、すぐに作業を実行する可能性がありますが、ビジーでキューが大きい場合は、作業が完了するまでに時間がかかる場合があります (この場合、「作業」は、画像)。
  3. 結果を必要とする呼び出しコード (あなたのコード) は、Future.isDone()true を返して作業が完了したことを示すまで作業を続けることができます。 -- このメソッドは作業の結果を返します。この場合は、スケーリングされた結果を表す BufferedImage です。

コードは文字通り次のようになります。

// Block until result is done
BufferedImage result = AsyncScalr.resize(origImage, 125).get();

このコードとScalr クラスを直接使用することの違いは、マルチスレッド システムでは、すべてのスレッドから Scalr.resize() (または任意の画像操作) を呼び出すと、それらのスレッドのすべてのスレッドがコストのかかるイメージ操作を開始し、同時作業で CPU をフラッディングし、システムの速度を低下させます (DB や Web サーバーなど、システム上で実行されている他のプロセスを停止します)。

AsyncScalr クラスを使用すると、任意の数のスレッドから AsyncScalr.resize (またはその他の操作) を安全に呼び出すことができ、ホスト システムが作業であふれることを心配する必要はありません。AsyncScalr.THREAD_COUNTは、一度に発生できる同時ジョブの数を決定します。通常、これをホスト マシンのコア数に設定するか、ホスト マシンがデータベースや Web サーバーなどの他の重要なサービスもホストしている場合は、コア数より少なく設定します (他のサービスを妨害しないようにするため)。スケーリングがビジーになったときに処理されます)。

「imgscar.async.threadCount」システム プロパティを使用して、アプリの起動時にコマンド ラインでこのスレッド値を設定できます。デフォルトでは「2」ですが、システムのメモリが不足していることが心配な場合は「1」に設定できます。

または、結果を待っている間にスレッドが実行できる作業がある場合は、次のようなことを実行して、非同期プログラミングを実際に活用できます。

// Queue up the scaling operation (or any other op)
Future<BufferedImage> result = AsyncScalr.resize(origImage, 125);

/*
 * You can do other work here that doesn't need 'result', like making
 * DB calls, cleaning up temp files or anything else you might need to
 * do.
 */

// Now we are all done and need the resulting image, so we wait for it.
BufferedImage scaledImage = result.get();

// Do something with the image...

画像がスケーリングされるのを待っている間ににできる作業が大量にある場合は、単純にループしresult.isDone()て、スケーリング操作が完了するまで作業を続けることができます。ただし、個別/特定の作業量しかない場合は、isDone をループする必要はありません。作業を行ってから呼び出しFuture.get()て結果を取得します (または準備が整うまでブロックします)。

それが役立つことを願っています!

于 2012-03-19T14:14:11.443 に答える