线程与进程
进程:
是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间
线程:
是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行. 一个进程 最少有一个线程
线程实际上是在进程基础之上的进一步划分,一个进程启动之后,里面的若干执行路径又可以划分成若干个线程
同步与异步
同步
:
排队执行
,
效率低但是安全
异步
:
同时执行
,
效率高但是数据不安全
并发与并行
并发
:指两个或多个事件在
同一个时间段内
发生。
并行
:指两个或多个事件在
同一时刻
发生(同时发生)
多线程技术
Java提供的用于实现线程的类:Thread
继承Thread实现线程(抢占式运行),在创建Thread对象后需要重写 run();方法(线程要执行的任务方法,此方法不能被直接调用,通过Thread对象的start();方法来启动任务。
实现Runnable接口
同样重写run();方法
Runnable更适合多个线程同时执行相同的任务的情况,避免了单继承的局限性。
守护线程:SetDaemon(true);
线程同步(解决线程不安全)
1.同步代码块
格式:synchronized(锁对象){ }
2.同步方法
在run();方法里面添加单独的方法,方法用synchronized修饰
3.显示锁
如:
Lock lock = new reentrantlock();
lock.lock();//锁
lock.unlock();//解锁
先来先到是公平锁,大家一块抢是非公平锁。
显示锁:fair参数为true就表示为公平锁
如:Lock lock = new Reentrantlock(true);
线程6种状态:
new:线程刚创建未启动
Runnble:正在执行
Blocked:排队状态
Waiting:无限等待状态
Timedwaitiiong:指定时间等待状态
Trminated:结束或退出线程
线程池:
缓存线程池:newCachedThreadPool();
定长线程池:newFixedThreadPool();括号里面传固定长度
单线程线程池:newSingleThreadExecutor();
周期定长线程池:
1.
ScheduleExecutorService s = Executors.newSsheduledThreadPool(传入固定值 如:2)
Service.schedule(new Runnable(){ },时间值秒如:5,Timeunit.SECONDS);
2.
周期性执行任务:
参数1:任务
参数2:延迟时长数字(第一次执行在什么时间以后)
参数3:周期时长数字(每隔多久执行一次)
参数4:时长数字的单位
如
方法ScheduleSAtFixedRate(new Runnable () { },5,1,Timunit.SECONDS);
Lambda表达式,函数式编程思想
如:
Thread t = new Thread(() -> System,out,println("史蒂夫"));