进程与线程
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);