1、线程与进程的区别
进程:
(1)拥有资源的基本单位。
(2)可独立调度和分派的基本单位。
(3) 开销较大
线程:
(1)线程本身拥有少量资源,它可以共享所属进程的资源。
(2)独立运行和调度的基本单位。
(3)轻量级的进程,开销小
2、线程与进程的关系
一个进程中同时存在几个执行体。单线程是按照函数的顺序执行,多线程是多段代码同时交替运行。CPU的一个核,在某一时刻只能执行一个线程,CPU在多个线程之间快速地切换(线程的调度算法)。
3、线程的实现方式
(1)继承Thread接口:
class Mythread extends Thread { public void run(){ System.out.println("我是一个线程!!"); } public static void main(String args[]){ Thread thread=new Thread(new Mythread()); thread.start();//启动,执行的是run方法 } }
(2)实现Runnable接口:
class Mythread implements Runnable { public void run(){ System.out.println("线程执行了!!"); } public static void main(String args []){ Thread thread=new Thread(new Mythread()); thread.start(); } }
(3)两种实现方式的对比:
以实现Runable接口的方式创建线程比继承Thread类有很大的优越性,因为类不能多重继承,即一个类只能继承一个类,那么如果该类已经继承了一个类,就不能实现多线程了,但是可以通过实现Runable接口的方式实现多线程。
4、线程并发库
(1)简介:
JDK5中增加了Doug Lea的并发库,这一引进给Java线程的管理和使用提供了强大的便利性,java.util.current包中提供了对线程优化、管理的各项操作,使得线程的使用变得得心应手,该包提供了线程的运行,线程池的创建,线程生命周期的控制。
(2)线程池:
分类:
newCachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需求可灵活回收空闲线程,若无可回收,则新建线程
newFixedThreadPool:创建一个定长线程池,可控制线程的最大并发数,超出的线程会在线程池中等待。
newScheduleThreadPool: 创建一个定长线程池,支持定时及周期性任务处理
newSingleThreadScheduledExecutor:创建一个单线程化的线程池,他只用唯一的工作栈来执行任务
使用:
class Mythread implements Runnable { public void run(){ System.out.println(Thread.currentThread().getName()); } public static void main(String args []){ ExecutorService executorService = Executors.newFixedThreadPool(3);// // Executors:线程池创建工厂类,调用方法返回线程池对象 executorService.submit(new Mythread()); executorService.submit(new Mythread()); executorService.submit(new Mythread()); } }
pool-1-thread-1 pool-1-thread-2 pool-1-thread-3
好处:
限制线程的个数,不会导致由于线程过多导致系统运行缓慢,甚至崩溃
节省了资源:我们用两种方式创建的线程,在使用后都会被销毁,频繁地创建和销毁会造成时间和资源的浪费。线程池是一个能够容纳多个线程的容器,里面的线程可以反复使用。