声明:文章内容全都是自己的学习总结,如有不对的地方请大家帮忙指出。有需要沟通交流的可加我QQ群:425120333
前面已经提到了三种实现多线程的方式,这三种都是最基础的(或者说是两种),这里要提到的其他实现方式,其实也只是都这三种方式的包装,
本质上还是原来的那些,只是包装成一个工具类让大家能够更方便的使用。
这里我会把我知道的所有的方法给大家说下(如果有遗漏欢迎大家补充,有些本质一样的用法不一样的我这里也当做两个处理)。
首先,是第一种通过线程池来实现多线程。线程池我的理解就是为了管理线程的,原先我们如果要启动10个任务(同样的任务)的话,
要通过new的方式十次,创建十个线程,来完成十个任务。有了线程池那就不一样了,我们可以只要一个(或者任意几个),
一个线程完成完成一个任务后,不会马上结束这个线程,而是放在线程池中,等待下一个任务的到来,然后执行。
代码示例(不用线程池的情况)
public class TestThreadPool {
public static void main(String[] args) {
Thread t = null;
for (int i = 0; i < 10; i++) {
t = new Thread(new ThreadDemo1());
t.start();
}
}
}
class ThreadDemo1 implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " 重复任务在执行。。。。");
}
}
控制台显示
Thread-0 重复任务在执行。。。。
Thread-1 重复任务在执行。。。。
Thread-2 重复任务在执行。。。。
Thread-5 重复任务在执行。。。。
Thread-3 重复任务在执行。。。。
Thread-8 重复任务在执行。。。。
Thread-6 重复任务在执行。。。。
Thread-9 重复任务在执行。。。。
Thread-7 重复任务在执行。。。。
Thread-4 重复任务在执行。。。。
从结果中可以看出这里是每个任务都是启动了一个线程。
代码示例(使用线程池的情况)
public class TestThreadPool {
public static void main(String[] args) {
//创建只含有三个线程容量的线程池
ExecutorService service = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
service.execute(new ThreadDemo1());
}
}
}
class ThreadDemo1 implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " 重复任务在执行。。。。");
}
}
控制台显示
pool-1-thread-1 重复任务在执行。。。。
pool-1-thread-3 重复任务在执行。。。。
pool-1-thread-2 重复任务在执行。。。。
pool-1-thread-1 重复任务在执行。。。。
pool-1-thread-3 重复任务在执行。。。。
pool-1-thread-2 重复任务在执行。。。。
pool-1-thread-3 重复任务在执行。。。。
pool-1-thread-1 重复任务在执行。。。。
pool-1-thread-3 重复任务在执行。。。。
pool-1-thread-2 重复任务在执行。。。。
从结果中可以看出,虽然在代码中new ThreadDemo1()循环了10次,可在线程池中实际上是三个线程交替运行的。
创建线程池还有其他三种类型,分别是:
ExecutorService service = Executors.newCachedThreadPool();
ExecutorService service = Executors.newSingleThreadExecutor();
ExecutorService service = Executors.newScheduledThreadPool(3);
具体的这四种线程池之间都有什么区别,大家可自己在网上查找资料,这里就不逐个说明了。