基础篇之多线程总结

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和线程池)

java基础之多线程总结二

java基础之多线程总结一(创建状态synchronized和volatile)

java基础之多线程总结一(创建状态synchronized和volatile)