Javaマルチスレッドの~~~ThreadPoolExecutorを使用してスレッドを作成する
2928 ワード
以前はスレッドを作成するときにアクティブなnewのThreadを呼び出してstartメソッドを呼び出していましたが、スレッドが非常に多い場合はタスクも
多くの場合、このように書くのは面倒ですが、もちろん効率も高くないかもしれません.Javaはスレッド作成器という概念のクラスを提供してくれました.
彼は私たちがこれらのスレッドを管理するのを助けることができます.あなたがやったのはコードを書いて、彼に渡すことです.彼女は自動的にあなたを実行します.
もちろん,cache付きthreadpoolは死んだスレッドの再呼び出しに対しても性能的に非常に優れているが,あまり多くのスレッドを渡すことはできない.
彼に管理してあげましょう.そうしないとシステムが崩れてしまいます.次に例を挙げましょう.
大量のスレッドが入ると、各スレッドにオブジェクトを作成します.これにより、システムが重荷に耐えられなくなります.Executorsは構築者を提供します.
法では、作成したスレッドの数がこの数を超えると、Executorsはこのスレッドを作成せず、オンライン・スレッド・プールが待機するように設定します.
中のスレッドが実行され、空き場所があってから新しいスレッドを作成し続けると、システムが丈夫になります.
上のコードは必要ありません.関数を構築する場所でコードを再インスタンス化するだけです.
多くの場合、このように書くのは面倒ですが、もちろん効率も高くないかもしれません.Javaはスレッド作成器という概念のクラスを提供してくれました.
彼は私たちがこれらのスレッドを管理するのを助けることができます.あなたがやったのはコードを書いて、彼に渡すことです.彼女は自動的にあなたを実行します.
もちろん,cache付きthreadpoolは死んだスレッドの再呼び出しに対しても性能的に非常に優れているが,あまり多くのスレッドを渡すことはできない.
彼に管理してあげましょう.そうしないとシステムが崩れてしまいます.次に例を挙げましょう.
package com.bird.concursey.charpet6;
import java.util.Date;
import java.util.concurrent.TimeUnit;
public class Task implements Runnable {
// store the creation date of the task
private Date initDate;
// store the name of the task
private String name;
public Task(String name) {
this.initDate = new Date();
this.name = name;
}
@Override
public void run() {
System.out.printf("%s: Task %s: Created on: %s
", Thread
.currentThread().getName(), name, initDate);
System.out.printf("%s: Task %s: Started on: %s
", Thread
.currentThread().getName(), name, new Date());
try {
Long duration = (long) (Math.random() * 10);
System.out.printf("%s: Task %s: Doing a task during %d seconds
",
Thread.currentThread().getName(), name, duration);
TimeUnit.SECONDS.sleep(duration);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.printf("%s: Task %s: Finished on: %s
",Thread.
currentThread().getName(),name,new Date());
}
}
package com.bird.concursey.charpet6;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
/**
* execute every task it receives using an executor
*
* @author bird 2014 9 23 9:03:01
*/
public class Server {
private ThreadPoolExecutor executor;
public Server() {
executor = (ThreadPoolExecutor) Executors.newCachedThreadPool();
}
public void executeTask(Task task) {
System.out.printf("Server: A new task has arrived
");
executor.execute(task);
System.out.printf("Server: Pool Size: %d
", executor.getPoolSize());
System.out.printf("Server: Active Count: %d
",
executor.getActiveCount());
System.out.printf("Server: Completed Tasks: %d
",
executor.getCompletedTaskCount());
}
public void endServer() {
executor.shutdown();
}
public static void main(String[] args) {
Server server = new Server();
for(int i = 0; i < 100; i++) {
Task task = new Task("Task" + i);
server.executeTask(task);
}
server.endServer();
}
}
大量のスレッドが入ると、各スレッドにオブジェクトを作成します.これにより、システムが重荷に耐えられなくなります.Executorsは構築者を提供します.
法では、作成したスレッドの数がこの数を超えると、Executorsはこのスレッドを作成せず、オンライン・スレッド・プールが待機するように設定します.
中のスレッドが実行され、空き場所があってから新しいスレッドを作成し続けると、システムが丈夫になります.
上のコードは必要ありません.関数を構築する場所でコードを再インスタンス化するだけです.
public Server() {
executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(5);
}