多线程基础知识:
什么是多线程
当你在做一个表格或者是一个ptt的时候,你的电脑可以在后台放着音乐,同时你还上了QQ与微信。尽管你的计算机只有一个cpu,但是你的cpu却可以使这些线程并发执行。从而使芯片性能得到提升。
什么是进程,什么是线程
进程
进程是指一个计算机内存中运行的应用程序,每个进程都有一个独立的内存空间。
打开任务管理器可以看到每个线程占有独立的内存空间。可通过结束任务按钮结束线程,释放内存空间。
线程
线程实际上是在进程基础之上的进一步划分,一个进程启动之后,里面的若干执行路径又可以划分成若干个线程。线程是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行. 一个进程最少有一个线程。当进程中一个线程都不存在时那它就被释放掉了。
并行与并发
并行
不同的代码块交替执行,交替做不同的事情。就好比在吃饭的时候来个电话,先停下吃饭去接电话。电话结束了再吃饭。
并发
不同的代码块同时执行。同一时间做2两件或多件事情。就好比电脑可以一边听音乐一边下载视频。
同步与异步
同步异步在请求上。
同步
就好比数据同步一样,前台提交了一个数据到数据库中。数据库刷新后看到这条数据。同步是有明显的先后执行顺序的。
异步
当你注册一个账号时,填写完用户名。当你鼠标离开这个表后,系统会提交一个请求到数据库中来检查用户名是否重复。重复的时候会返回给前台信息,让有用户知道用户名重复。这条请求不影响整个系统程序的运行。这个异步请求可以和整个程序同时运行并且互补影响。
wait()与sleep()的区别
sleep()
sleep()是定时休眠;当一段事件后,sleep会自动唤醒,并执行程序。就好比如人睡一定时间后会自定醒来。
wait()
wait()是唤醒休眠;进入了深层睡眠,他只有在别人唤醒后才能执行。就像美国队长被冰封,通过别人解冻唤醒后才能够醒来。无人唤醒将会一直沉睡下去。
多线程中的区别
而在多线程中,当抱有锁时执行睡眠, wait 会将锁抛出睡眠,而sleep会持有锁睡眠。也就是说不用等待wait的唤醒后面程序可以正常运行。而sleep需要等待程序的唤醒执行将锁抛出后,持有锁的程序才能正常运行。
线程的六大状态
初始化状态(new)
线程刚刚创建的时候处于此状态。
就绪状态(runnable)/运行中状态(running)
此线程有资格运行任务,但是cpu没有分配到他。/执行中的线程处于此状态。
阻塞状态(blocked)
被阻塞等待监听器锁定的线程处于此状态。
等待(waiting)
cpu不会给此线程分配资源,此线程要被唤醒,否则会处于无限期的等待状态。(wait)
超时等待(timed waiting)
cpu不会给此线程分配资源,但是他的等待是有时间限制的。(sleep)
中止状态(terminated)
线程的run()任务执行完成,线程失去生命。
用java代码实现简单多线程程序
支线程
public class r1 implements Runnable{
@Override
public void run() {
//线程的任务
for (int i = 0; i <10;i++ ){
System.out.println("支线程"+i);
}
}
}
主线程
public class r2 {
/**
* 多线程任务
*/
public static void main(String[] args) {
//创建一个任务对象
r1 r1 = new r1();
//创建一个线程,并为其分配一个任务
Thread thread = new Thread(r1);
//执行这个线程
thread.start();
//主线程
for (int i = 0; i <10;i++ ){
System.out.println("主线程"+i);
}
}
}
运行结果:
线程的执行是抢占式。谁抢到执行程序在释放掉后,在进行抢占执行。