创建线程三种方式及对比
-
采用实现 Runnable、Callable 接口的方式创建多线程时,线程类只是实现了 Runnable 接口或 Callable 接口,还可以继承其他类。
-
使用继承 Thread 类的方式创建多线程时,编写简单,如果需要访问当前线程,则无需使用 Thread.currentThread() 方法,直接使用 this 即可获得当前线程。
Thread、Runnable、Callable创建线程实例
public class Demo1 {
public static void main(String[] args) {
// 线程的三种创建方法
//1. 继承Thread方法并实例化 使用.start()方法
B b= new B();
//2. 实现Runnable并实例化 再作为参数传入Thread构造方法中并实例化 使用.start()方法
C c =new C();
Thread d= new Thread(c);
//3. 实现Callable接口并实例化
//再作为参数传入FutureTask并实例化
//再作为参数传入Thread并类实例化 使用.start()方法
D e = new D();
FutureTask f = new FutureTask(e);
Thread g = new Thread(f);
b.start();//b
d.start();//c
g.start();//d
}
}
class B extends Thread{
@Override
public void run() {
for(int i=0;i<10;i++){
System.out.println("B运行");
}
}
}
class C implements Runnable{
@Override
public void run() {
for(int i=0;i<10;i++){
System.out.println("C运行");
}
}
}
class D implements Callable{
@Override
public Object call() throws Exception {
for(int i=0;i<10;i++){
System.out.println("D运行");
}
return null;
}
}
四种进程池(第四种创建线程的方法)
Java通过Executors(java1.5并发包中的类)来创建四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则创建线程。
newFixedThreadPool创建一个定长线程池,可控制线程池最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool创建一个 定时线程池,支持定时以及周期性任务执行。
newSingleThreadExecutor创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序执行。(FIFO,LIFO,优先级)
1:newCachedThreadPool创建一个可缓存线程池。
♦CachedThreadPool的corePoolSize被设置为0,即corePool为空;
♦maximumPoolSize被设置为Integer.MAX_VALUE,即maximum是无界的。
♦这里keepAliveTime设置为60秒,意味着空闲的线程最多可以等待任务60秒,否则将被回收。
♦CachedThreadPool使用没有容量的SynchronousQueue作为主线程池的工作队列,它是一个没有容量的阻塞队列。每个插入操作必须等待另一个线程的对应移除操作。这意味着,如果主线程提交任务的速度高于线程池中处理任务的速度时,CachedThreadPool会不断创建新线程。极端情况下,CachedThreadPool会因为创建过多线程而耗尽CPU资源。
2:newFixedThreadPool创建一个定长线程池。(指定core和max,且core=max=nThraed)
通过构造函数可知,该线程池的核心线程数和最大线程数是一样的。
FixedThreadPool的corePoolSize的值和maxiumPoolSize的值都被设置为创建FixedThreadPool时指定的参数nThreads的大小。
0L则表示当线程池中的线程数量超过核心线程的数量时,多余的线程将被立即停止
最后一个参数表示FixedThreadPool使用了无界队列LinkedBlockingQueue作为线程池的做工队列,由于是无界的,当线程池的线程数达到corePoolSize后,新任务将在无界队列中等待,因此线程池的线程数量不会超过maxiumPoolSize,同时maxiumPoolSize也就变成了一个无效的参数,并且运行中的线程池也并不会拒绝任务。
3:newScheduledThreadPool创建一个周期性的线程池。(指定core,max为max)
4:newSingleThreadExecutor创建一个单线程化的线程池。(core和max都默认为1)
SingleThreadExecutor的corePoolSize和maxiumPoolSize都被设置1。
线程池实例化转载自https://www.runoob.com/java/java-multithreading.html