基础篇之多线程总结
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础篇之多线程总结相关的知识,希望对你有一定的参考价值。
1.进程与线程:
线程:一个进程可以拥有多个并行的线程,线程是进程中一个程序执行控制的单元,一个进程中的线程会共享内存地址空间(因为线程所使用的资源是它所在进程的资源),所以访问相同的变量和对象,所以进程内线程之间的数据也是共享的,且线程组的通信是在同一地址空间上进行,所以不需要额外的通信机制,使得传递的消息速度更快,每个线程在栈里面是独立的,单个线程中程序是有序的,一个线程看另一个线程中程序是无序的 ,线程是基于进程的
进程:由cpu,data,code三部分组成,每个进程都是独立的,由系统分配,进程间的切换开销较大,进程基于操作系统;
2.并行与并发
并发:多个线程访问同一份资源
并行:在多个cpu情形下,多个线程同时运行
3.线程数与运行时间
线程数:我们看到的虚拟机里面显示的线程数,是虚拟的线程数,例如单线程,他是将时间分成很多小的时间片,不同的时间片会调用不同的虚拟的线程程序段,当调用这个程序是其他程序会挂起
运行时间:运行时间与实际的是线程数有直接联系,而且过多的线程容易引起并发等问题,所以不一定快
4.开启线程的形式
Thread类:
步骤:
1>定义类继承Thread类;
2>目的是复写run方法,将要让线程运行的代码都存储到run方法中;
3>通过创建Thread类的子类对象,创建线程对象;
4>调用线程的start方法,开启线程,并执行run方法。
Runnable接口
步骤:
1>定义类实现Runnable接口。
2>覆盖接口中的run方法。
3>通过Thread类创建线程对象;
4>将实现了Runnable接口的子类对象作为实际参数传递给Thread类中的构造函数。
5>调用线程的start方法,开启线程,并执行run方法。
Callable接口
步骤:
1>定义类实现callable接口。
2>覆盖接口中的call方法。
3>创建一个可重用的固定线程池
4>将实现了callable接口的子类对象作为实际参数传递给submit类中的构造函数,开启线程池所有线程
5>shutdown停止线程池的所有线程,也可以不采用shutdown,自定义停止线程
Callable 与runnable接口的区别
1>callable定义的是call方法,runnable定义的是run方法
2>callable可抛出异常,run方法不可抛出异常
3>callable有返回值,runnable没有返回值
5. 线程在运行过程中的状态
1> 新生状态:new一个thread类或者其子类之后,就处于新生状态
2> 就绪状态:线程start后,就处于就绪状态
3> 运行状态:运行run方法中的代码,直到调用完成,或者调用其他方法而停止
4> 阻塞状态:处于运行的线程在遇到某些情况后会停止自己的运行,进入阻塞状态,下次运行时会回到停止的状态接着运行(如sleep,jion,io等)
5> 死亡状态:被强制终止(如stop,destroy等),或者运行完成
6. 线程停止的方式
Thread的stop及destroy Api已经标明已过时,所有多用自己定义的线程停止,启动线程停止后,线程是在一定的延时后最终停止
7. 线程中常用的一些方法
1> isAlive 线程是否还存活
2> currentThread 返回当前线程地址
3> setName 设置名称
4> getName 获取该线程名称
5> currentThread. getName获取当前线程名称
6> setpriority 设置优先级,指的是概率而不是运行顺序
7> sleep 线程休眠,不会释放锁
8> wait (Object方法)暂停该线程,会释放锁
9> notify (Object方法)唤醒该对象下的单个线程
10> notifyAll (Object方法)唤醒所有该对象下的线程
8. 同步
添加同步的原因:多个线程访问同一份资源,为了确保这份资源的安全所以加入了同步,
过多的同步可能会造成死锁,因为都不肯释放资源。
9. 常用解决死锁的方法
1> 消费者生产者思想法:加入一个标志位,使生产时就不能消费,消费时就不能生产
2> Timer类来实现等
以上是关于基础篇之多线程总结的主要内容,如果未能解决你的问题,请参考以下文章
java基础之多线程总结三(AQSThreadLocal和线程池)
java基础之多线程总结三(AQSThreadLocal和线程池)
java基础之多线程总结三(AQSThreadLocal和线程池)