欢迎各位大牛指教

线程与进程区别

进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程。

线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。

  线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止。

  多进程是指操作系统能同时运行多个任务(程序)。

  多线程是指在同一程序中有多个顺序流在执行。

java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口。

程序启动运行main时候,java虚拟机启动一个进程,主线程main在main()调用时候被创建。随着调用MitiSay的两个对象的start方法,另外两个线程也启动了,这样,整个应用就在多线程下运行。
注意:start()方法的调用后并不是立即执行多线程代码,而是使得该线程变为可运行态(Runnable),什么时候运行是由操作系统决定的。
从程序运行的结果可以发现,多线程程序是乱序执行。因此,只有乱序执行的代码才有必要设计为多线程。
Thread.sleep()方法调用目的是不让当前线程独自霸占该进程所获取的CPU资源,以留出一定时间给其他线程执行的机会。
实际上所有的多线程代码执行顺序都是不确定的,每次执行的结果都是随机的。

实现Runnable接口比继承Thread类所具有的优势:

1):适合多个相同的程序代码的线程去处理同一个资源

2):可以避免java中的单继承的限制

3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。

线程的四种状态:

开始(等待)、运行、挂起、停止

1、进程和线程的概念

进程:运行中的应用程序称为进程,拥有系统资源(cpu、内存)

线程:进程中的一段代码,一个进程中可以有多段代码。本身不拥有资源(共享所在进程的资源)

Java中,程序入口被自动创建为主线程,在主线程中可以创建多个子线程。

区别:

 1、是否占有资源问题

 2、创建或撤销一个进程所需要的开销比创建或撤销一个线程所需要的开销大。

 3、进程为重量级组件,线程为轻量级组件

多进程: 在操作系统中能同时运行多个任务(程序)

多线程: 在同一应用程序中有多个功能流同时执行

 

2、线程的主要特点

①、不能以一个文件名的方式独立存在在磁盘中;

②、不能单独执行,只有在进程启动后才可启动;

③、线程可以共享进程相同的内存(代码与数据)。

 

3、线程的主要用途

①、利用它可以完成重复性的工作(如实现动画、声音等的播放)。

②、从事一次性较费时的初始化工作(如网络连接、声音数据文件的加载)。

③、并发执行的运行效果(一个进程多个线程)以实现更复杂的功能

 

4、多线程(多个线程同时运行)程序的主要优点

①、可以减轻系统性能方面的瓶颈,因为可以并行操作;

②、提高CPU的处理器的效率,在多线程中,通过优先级管理,可以使重要的程序优先操作,提高了任务管理的灵活性;另一方面,在多CPU系统中,可以把不同的线程在不同的CPU中执行,真正做到同时处理多任务。

多线程和单线程:

线程本身由于创建和切换的开销,采用多线程并不会提高程序的执行速度,反而会降低速度,(对于频繁的IO操作的程序,单线程情况下,虽然两个程序主要使用不同的资源,但是在线程内部只能串行执行,在IO操作时,CPU被闲置,多线程情况下,如果一个线程在等待IO操作,线程会马上调度到另一个线程,并发的使用了不同的资源。)

多线程应用:耗时或大量占用处理器的任务阻塞用户界面操作,各个任务必须等待外部资源

多线程的实现:

 继承thread类,实现runable接口

其实原理上是一样的因为继承的Thread类也是实现runable接口的

然后thread类和runable接口都实现了run方法,其实这种模式就是代理模式的一种体现。

Thread与runable区别:

如果一个类继承Thread类,则不适合共享资源,但是如果实现Runable接口的话就很容易实现共享资源了。

实现runable接口适合多个相同的程序代码的线程去处理同一个资源

可以避免java中单继承的限制:例如你既要使用多线程继承Thread又要使用定时器继承Timertask这样就会有冲突

增加程序的健壮性,代码可以被多个线程共享,代码和数据独立

所以在实际应用中我们尽量使用实现接口的方式

注意:其实main方法也是一个线程,java中所有线程都是同时启动的,至于谁先执行那就看谁先得到CPU资源了,每次程序运行的时候会同时启动两个线程,一个是main线程,另一个就是垃圾收集线程,每当我们启动一个java类的时候就会执行一个jvm。

还需要注意的一点就是,线程虽然有优先级之分,但是其实并不是谁的优先级越高就越早执行,谁先执行主要看谁先得到CPU使用资源,只能说优先级高的线程比较容易获得CPU使用权,但并不一定他会先执行,只能说他先执行的概率会大很多。

定时器所继承的Timer工具类实际上也是一个实现了Runable接口的抽象类,我们通过继承这个类来创建定时任务,安排一个线程在未来某个时间执行。

线程安全:多个线程同时操作同一个对象,就容易出现数据混乱现象,所以多线程时最好加上同步锁

线程安全问题最容易出现在单例模式中

就好比同一件东西,,一个人(代表线程)使用了,另一个人也同时使用,这件东西的内容就会出现混乱,而对象锁的作用就是说明这个东西只许一个人使用,他使用完后才允许另一个人使用。

文件转移:

一般的话需要一个执行完了之后下一个才能进行,而使用线程的话可以同时运行,就好比一个是一列队伍一个一个去进行,而线程的话就好比是一行都已经准备就绪同时进行,所以线程的话效率高的多,

 

posted @ 2016-08-23 13:14  夏沫秋至  阅读(3380)  评论(0编辑  收藏  举报