package thread;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ExecutorDemo
{
public static void main(String[] args)
{
//创建一个线程池来并发执行三个任务
ExecutorService executor = Executors.newFixedThreadPool(3);
//将要执行的任务提交给线程池的执行器。
executor.execute(new PrintChar('a',100));
executor.execute(new PrintChar('b',100));
executor.execute(new PrintNum(100));
//关闭执行器,之后便不能再接受新的任务。
executor.shutdown();
}
}
class PrintChar implements Runnable
{
private char charToPrint;
private int times;
public PrintChar(char c,int t)
{
charToPrint = c;
times = t;
}
public void run()
{
for(int i=0;i<times;i++)
{
System.out.println(charToPrint);
}
}
}
class PrintNum implements Runnable
{
private int lastNum;
public PrintNum(int n)
{
lastNum = n;
}
public void run()
{
for(int i=0;i<=lastNum;i++)
{
System.out.println(" "+i);
}
}
}
/*
毕老师在讲线程的等待唤醒机制时,提到了线程池的概念,在此分享下线程池的使用,
我们之前学习的都是执行单任务的多线程,当要执行多任务的时候,再用单任务的方式去
处理就比较低效了。而线程池则是管理并发执行多个任务的理想方法。
java提供Eexutor接口来执行线程池中的任务,提供ExecutorService接口来管理
和控制任务,ExecutorService是Executor的子接口。可使用Executors类中的静态方法
来创建Excutor对象,newFixedThreadPool(int)方法在线程池中创建固定数目的线程。
如果线程完成了任务的执行,它可以被重新使用以执行另外一个任务。如果线程池中所有的线程
都不处于空闲状态,且有任务在等待执行,此时如果由于一个错误终止了一个线程,就会创建
一个新线程来替代它。
ExecutorService executor = Executors.newFixedThreadPool(3);在代码中表示执行器
创建三个线程来并发执行三个任务。若改为ExecutorService executor = Executors.newFixedThreadPool(1);
此时这三个可运行的任务将顺序执行,因为在线程池中只有一个线程。若改为ExecutorService executor = Executors.newFixedThreadPool();
则是为每个等待的任务创建一个新线程,此时所有的任务都并发执行。
为一个任务创建一个线程,用Thread类。若要为多个任务创建线程,最好使用线程池。
*/
|
|