2011-12-02 4 views
10

実行可能なスイングワーカースレッドの数には上限がありますか、それともメモリがサポートする限りですか?これはどこかで設定可能ですか?実行できるスイングワーカースレッドの最大数は

+0

私はSwingWorkerと混乱する点は、SwingWorker.execute()メソッドがデフォルト/プライベートスレッドプール上でワーカーを実行することです。これは少数のスレッドに固定されています。これは、小さな/単純なアプリにとってはおそらく十分で妥当なものです。ただし、同時実行性をより詳細に制御するためには、2つの観察を行います。1. SwingWorkersはRunnableFuturesです。2. SwingWorker.execute()メソッドを呼び出してSwingWorkersを実行する必要はありません。だから、独自のスレッドプール(ExecutorService)を必要に応じて構成し、SwingWorkersをsubmit()またはexecute()するだけです。 –

答えて

13

SwingWorkerはスレッド自体ではなく、スレッドで実行されるタスクです。通常、ExecutorServiceを使用してSwingWorkerのインスタンスを実行します。あなたはそれ以上のインスタンスSwingWorker nより、彼らはキューに入れ、プールからのスレッドが利用可能になるまで待たなければならない提出する場合は、今すぐ

int n = 20; // Maximum number of threads 
ExecutorService threadPool = Executors.newFixedThreadPool(n); 
SwingWorker w; //don't forget to initialize 
threadPool.submit(w); 

:このインタフェースはまた、スレッド数を設定することができます。

+0

理論的に言えば、それぞれのスレッドを個別に実行すれば、任意の数のSwing Workerタスクを実行できます。 –

+0

原則としてはい。もちろんコンピューティングパワーが問題になります。 – mort

+1

um ....何ですか?なぜあなたはこれをしますか? SwingWorkerにはデフォルトのサイズ10のプールがあり、 'SwingWorker#execute()'を呼び出すと、タスクのスケジューリングを行います.'このSwingWorkerをワーカースレッドで実行するようにスケジューリングします。利用可能なワーカースレッドがいくつかあります。 ':https://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html#execute()...これを自分で行うことは再発明しています車輪。 SwingWorkerは作成されたユーティリティなので、これを行う必要はありません。あなたがこれを行う唯一の理由は、デフォルトのプールサイズが10より小さすぎる場合です。その時点で、生の 'Runnable'を使用します – searchengine27

2
final int corePoolSize = 100; 
final int maximumPoolSize = 100; 
final long keepAliveTime = 100000; 
final TimeUnit unit = TimeUnit.SECONDS; 
final BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(maximumPoolSize); 
sun.awt.AppContext.getAppContext().put(SwingWorker.class, 
       new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue)); 

上記のコードサンプルでは、​​既定数のSwingWorkersを実行することができます。もちろん、いくつかのバックドアsun.awt.AppContextクラスにアクセスしていますが、それは関心のある人にとっては簡単な回避策であり、独自のExecutorServiceを提供することはできません。

関連する問題