关于java中的多线程与线程池简介

进程与线程

1.进程是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间(发展到今天,一个应用程序里面已经包含多个进程)

2.线程时在进程基础上的进一步划分,一个进程启动后里面有多个路径,每个路径就是一个线程,线程之间自由切换,并发执行,一个进程至少有一个进程

 创建一个线程(三种方法):

1.继承Thread类

2.继承Runnable接口

3.事项Callable接口(有返回值)

多线程会有内存泄漏的隐患,可以通过三种方法解决

1.同步代码块:用关键字synchronized修饰要同步的代码块,

Object o = new Object();

Synchronize(o){

要同步,会造成内存泄漏的代码

}

2.同步方法:用关键字synchronized修饰方法

2.显示的Lock锁:

线程池

线程的创建和关闭都要消耗大量的时间,如果多线程并发,而每一个线程又执行很短的时间就结束啦,那么就耗费啦大量的时间创建和关闭线程,真正执行任务的时间很少,为了解决这个问题,建立线程池,线程池是一个拥有多个线程的容器,池中包含多个可以反复利用的线程,避免啦频繁的创建和销毁线程,提高系统xiaolv.

java中有四种线程池:

1.缓存线程池

缓存线程池长度无限制,执行流程:

 -判断线程池是否存在空闲线程

-存在则使用

-不存在,则创建线程,并放入线程池,然后使用

ExecutorService service = Executors.newCachedThreadPool();
service.executor(new Runnable(){
   public void run(){
    System.out.println("线程名称:"+Thread.currentThread().getName);
}
});
service.executor(new Runnable(){
   public void run(){
    System.out.println("线程名称:"+Thread.currentThread().getName);
}
});
service.executor(new Runnable(){
   public void run(){
    System.out.println("线程名称:"+Thread.currentThread().getName);
}
});

2.定长线程池

长度是指定的数值

执行流程:

-判断线程池中是否有空闲线程

-存在则使用

-不存在空闲线程,且线程池未满的情况下,则创建线程,并放入线程池,然后使用

-不存在空闲线程,且线程池已满的情况下,则等待线程池存在空闲线程

ExecutorService service = Executor.newFixedThreadPool(2);
service.execute(new Runnable(){
     public void run(){
       System.out.println("线程的名称:"+Thread.currentThread().getName());
}
});
service.execute(new Runnable(){
     public void run(){
       System.out.println("线程的名称:"+Thread.currentThread().getName());
}
});

3.单线程线程池

线程池中只有一个线程,效果与定长线程池创建的时候传入数值1的效果一致

执行流程:

-判断线程池的单个线程是否空闲

-空闲则使用

-不空闲,则等待池中的单个线程空闲后再使用

ExecutorService service = Executor.newSingleThreadExecutor();
service.execute(new Runnable(){
public void run(){
       System.out.println("线程名称:"+Thread.currentThread().getName());
}
});

4.周期性任务定长线程池

 周期任务 定长线程池

执行流程:

-判断线程池是否存在空闲线程

-存在则使用

-不存在空闲线程,且线程池未满的情况下,则创建线程,并放入线程池,然后使用

-不存在空闲线程,且线程池已满的情况下,则等待线程池存在空闲线程

周期性任务执行时:

-(1)定时执行

-参数1:runnable类型的任务

-参数2:时长数字

-参数3:时长数字的单位

ScheduledExecutorService service = Executors.newScheduledThreadPool(2);
service.schedule(new Runnable(){
public void run(){
System.out.println("111111111");
}
},5,TimeUnit.SECONDS);

 - (2)周期执行

-参数1:runnable类型的任务

-参数2:时长数字(延迟执行的时长)

-参数3:周期时长

-参数4:时长数字的单位

ScheduledExecutorService service = Executors.newScheduledThreadPool(2);
service.scheduleAtFixedRate(new Runnable(){

  public void run(){
  System.out.println("111111111111111");
}
},5,2,TimeUnit.SECONDS);

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值