Java多线程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ma_hoking/article/details/50185501

       对于并发来说,一般可以有多进程和多线程两种方式。进程是占用的CPU、内存等系统的基本单位,而线程又是进程的执行单元。多进程的并发对于数据的共享是很困难的,而线程去相当的容易,因此大多数时候说的并发指的就是多线程。Java的多线程是语言级的,并不依赖任何的操作系统API,而且Java的多线程编程能力是很强大且好用的。
1、什么是多线程
分析:

       每个正在系统上运行的程序都是一个进程,每个进程包含一个或多个线程。进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集合,或者是程序的特殊段,它可以在程序中独立执行,也可以把它理解为代码运行的上下文。
       多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间相互独立。线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度。
多线程是为了使用多个线程并行的工作可以完成多项任务,以提高系统效率。线程是在同一时间需要完成多项任务的时候被实现的。使用多线程可以带来以下几点好处:
       □使用线程可以把占据长时间的程序中的任务放到后台去处理。
       □用户界面可以更加吸引人。如用户单机了一个按钮来触发某些事件的处理,可以弹出一个进度条来显示处理的进度。
       □程序的运行速度可能加快。
       □在一些等待的任务实现上如用户输入、文件读写和网络传输数据等,线程就比较空闲 了。在这种情况下可以释放一些珍贵的资源,如内存占用等。
解答:
        线程是进程中的一个执行单元,又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负载调度。
而多线程是这样一种机制:它允许在程序中并发执行多个指令流,每个指令流都称为一个线程。多线程进制下的线程彼此相互独立,比较容易共享数据,通过并发执行的方式提高程序的效率和性能。
2、解释进程和线程的区别
分析:
       进程(Process)普遍的解释是:进程是程序的一次执行。而线程(Thread)可以理解为进程中执行的一段程序片段。也就是说,它们首先是一种包含关系。
       多线程共存于应用程序中,是现在操作系统中的基本特征和重要标志。在Windows、UNIX等多任务操作系统中,每个应用系统的执行都在操作系统内核中登记一个进程标志,操作系统根据分配的标志对应用程序的执行调度和系统资源分配。也就是说,进程是占用系统资源的基本单位。
       线程的划分尺度小于进程,使得多线程程序的并发性高。另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存。多线程在共享数据方面更加方便,从而极大地提高了程序的运行效率。
       线程在执行过程中与进程还是有区别的。每个独立的进程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能独立执行,必须依赖存在应用程序中,由应用程序提供多个线程执行控制。
       当初,引入进程概念的目的是这样的:进程可以提高系统的并发性,提高CPU的使用率,从而提高程序的性能。在以前单道操作系统中,一次只执行一个程序,这样执行效率很低,从而提高程序的性能。在以前单道操作系统中,一次只执行一个程序,这样执行效率很低,资源得不到充分的利用。所以,后来多道操作系统出现了,由于多道操作系统一次并发执行很多程序,但管理起来非常麻烦。因此,进程的概念就被提出来了,它是一个程序动态执行表现,而且进程中包含了程序的资源,并管理程序如何去使用资源。可以说进程是程序的一种动态表现形式。
        那么,又为什么要引入线程呢?进程与进程之间的通讯是十分慢的,因为进程管理分配很多资源,所以转换起来很慢。就这样,线程产生了,它是比进程更小的单位,一个进程中只要一个或多个线程,那么每一个线程之间的通讯相对进程而言则快了很多,因为线程只涉及到CPU的资源分配。一个进程中的线程是可以相互通讯的,但不同进程之间的线程是不能相互通信的。
解答:
        进程和线程之间的区别主要包括:
       □线程的划分尺度小于进程,线程隶属于某个进程。
       □进程是程序的一种动态形式,是CPU、内存等资源占用的基本单位,而线程是不能独立的占有这些资源的。
       □进程之间相互独立,通信比较困难,而线程之间共享一块内存区域,通讯比较方便。
       □进程在执行过程中,包含比较固定的入口、执行顺序和出口,而线程的这些过程会被应用程序所控制。
3、如何让一个类成为线程类
解答

     让一个类称为线程类的方式有两种,一个是实现java.lang.Runnable接口,另一个是继承自java.lang.Thread类。

4、解释Runnable接口与Thread类的区别

解答:
Runnable接口与Thread类的区别主要包括以下几个方面:
□线程类继承自Thread则不能继承自其它类,而Runnable接口可以。
□线程类继承自Thread相对于Runnable来说,使用线程的方法更方便一些。
□实现Runnable接口的线程类的多个线程,可以更方便的访问同一变量,而Thread类则需要内部类来进行替代。

5、如何启动一个线程
解答:

       继承自Thread类的线程类,可以通过new关键创建一个线程对象后,执行start()方法开始一个线程。而实现了Runnable接口的线程类,需要用它的对象实例,作为Thread类构造方法的参数,创建一个Thread对象,然后调用start()方法开始一个线程。

6、如何用sychronized来让线程同步
分析:

        多线程一旦操作同一块内存的数据,就可能造成数据的混乱,也就是常说的线程安全问题。Java针对这样的问题,采用sychronized关键字来帮助开发者解决这样的问题。
解答:
        synchronized关键字代表要为某一段代码加上一个同步锁,这样的锁是绑定在某一个对象上边的。如果是同步代码块,需要为该sychronized关键字提供一个对象的引用;如果是同步方法,只需要加上一个sychronized关键字的修饰。
        synchronized为某段代码加上锁以后,某个线程进入该段代码之前,首先需要检查该锁是否被占用,如果没有被占用则需要继续执行;如果应经被占用,则需要等到该锁被释放以后才能继续执行。其中,线程执行完该段代码就是释放锁的标志。

没有更多推荐了,返回首页