1. Classic example to use Thread pool
public class ThreadPoolOne {
public static void main(String[] args) {
// use a static Executors class create a fixed size thread pool
ExecutorService threadPool = Executors.newFixedThreadPool(3);
for (int i=0;i<10;i++){ //this way we give 10 tasks to a 3 running threads to do.
Runnable task = new Runnable(){
@Override
public void run() {
int i = new Random().nextInt();
System.out.println(Thread.currentThread().getName()+" is running id is "+ i);
}
};
//create 10 runnable for 10 thread
threadPool.execute(task);
}
//at last,we should shutdown thread pool
threadPool.shutdown();
}
}
Executors is a static class, we can use it to create a threadPool, and use the execute() passed by a runnable to start the thread, this doesn't have the return value of the thread. If we want to get the return value of the running thread, we can use the threadPool.submit() method. This example, the thread pool arrange the execution of it's threads. we don't have much to do about when will a thread start, and the frequence of a thread.
2. start a thread at a particular time
if we want to start a thread at a paticular time or at a frequence. we can use the ScheduledExecutorService class
public class ThreadPoolScheduledThread {
public static void main(String[] args) {
final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(5);//the pool size is 5
//create a runnable task
Runnable task = new Runnable(){
@Override
public void run() {
int i = new Random().nextInt();
System.out.println(Thread.currentThread().getName()+" is running id is "+ i);
}
};
//execute after 2 seconds, and will execute every 3 seconds
final ScheduledFuture future1 = scheduler.scheduleAtFixedRate(task, 2, 3, TimeUnit.SECONDS);
//example 2: execute after 1 minute, and will execute every 5 minute
final ScheduledFuture future2 = scheduler.scheduleAtFixedRate(task, 1, 5, TimeUnit.MINUTES);
//do a work after a period of time
//same way for do a work at a particular time(use that time - the current time)
Runnable taskFinish = new Runnable(){
@Override
public void run() {
future1.cancel(true);//ture means if the thread is running, we still want cancel it.
future2.cancel(true);
scheduler.shutdown();
}
};
//execute a task after 30 seconds
scheduler.schedule(taskFinish, 30, TimeUnit.SECONDS);
}
}