多线程

创建线程三种方式及对比

  1. 采用实现 Runnable、Callable 接口的方式创建多线程时,线程类只是实现了 Runnable 接口或 Callable 接口,还可以继承其他类。

  2. 使用继承 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值