多线程

进程:

进程是一个“执行中的程序”。
程序是一个没有生命的实体,只有在运行时处理器才会赋予它生命,
才能成为一个活动的实体,我们称其为“进程”。

线程:

线程是进程中执行运算的最小单位,是被系统独立调度和分派的基本单位。
一个进程中可以包含多个线程在执行,这些线程可以共享同属一个进程的
全部资源。
 

Jvm进程

当一个main方法运行之后,就会启用一个jvm进程,而这个进程默认就拥有
一个主线程,也可以说main方法就是主线程,当main方法结束之后,程序也
就结束,因此对应的jvm进程也就随之消失
 

Java实现多线程的两种方式:

1. 继承Thread类,只有继承了Thread类的子类,才可以称之为线程
2. 实现Runnable接口,实现了Runnable接口的类并不是一个线程,
它只是一个可以被线程去执行的可运行对象。多个线程可以同时来执行这个对象

两种方式的区别:

继承Thread类的线程是各自拥有自己的run方法执行。而实现Runnable接口的类
是一个可运行的对象,本身并不是线程,它是可以被其他线程共享去执行的,
因此其他线程都会共享Runnbale对象中的run方法。我们也可以认为一个
runnable对象就是一个共享资源,它可以被多个线程所共享。

Java的线程同步:

当多个线程同时操作一个数据资源时(共享资源),将会导致数据资源错误,
这就是所谓的线程安全问题。解决办法就是使用线程同步,在Java中线程
同步可以使用同步代码块或者同步方法(关键字:synchronized)。
使用synchronized将共享资源锁定之后,那么同一时刻只能有一个线程去操作,
其他县城都处于等待状态,更确切的说,其他的被调度到一个叫做锁池当中。
当同步代码块或者同步方法执行完之后,会自动释放这把钥匙,那么锁池中
的线程将会释放和当前的线程一起去竞争这把key。
 

线程池

当任务量非常大的时候,如果每一个任务都开辟一个线程去处理,
那么这将耗费非常大的资源,降低了服务器的性能,最终将可能
导致JVM内存溢出,无法处理。这时,我们会考虑采用线程池的机
制来解决这个问题,所谓的线程池,就是最大限度的使县城重用,
可以使用少量的线程去处理大量的任务。
在JDK1.5之后,已经提供了完善的线程池API供我们使用,
常用的线程池有四种
1)newFixedThreadPool(固定线程池)
2) newCachedThreadPool(缓存线程池)
3) newSingleThreadExecutor(单例线程池)
4) ScheduledExecutorService(定时线程池)
 
原文地址:https://www.cnblogs.com/BruningHUA/p/6220935.html