码迷,mamicode.com
首页 > 编程语言 > 详细

找工作——多线程

时间:2016-03-05 18:48:41      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:

1. 进程与线程

定义

  进程是程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。

  线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。、

关系

  一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.

区别

a.地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。

b.通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。

c.调度和切换:线程上下文切换比进程上下文切换要快得多。

d.在多线程OS中,进程不是一个可执行的实体。

2. Java中的线程的生命周期大体可分为5种状态

①NEW:这种情况指的是,通过New关键字创建了Thread类(或其子类)的对象

②RUNNABLE:这种情况指的是Thread类的对象调用了start()方法,这时的线程就等待时间片轮转到自己这,以便获得CPU;第二种情况就是处于BLOCKED状态的线程结束了当前的BLOCKED状态之后重新回到RUNNABLE状态。

③RUNNING:这时的线程指的是获得CPU的RUNNABLE线程,RUNNING状态是所有线程都希望获得的状态。

④DEAD:处于RUNNING状态的线程,在执行完run方法之后,就变成了DEAD状态了。

⑤BLOCKED:这种状态指的是处于RUNNING状态的线程,出于某种原因,比如调用了sleep方法、等待用户输入等而让出当前的CPU给其他的线程。

处于RUNNABLE状态的线程变为BLOCKED状态的原因,除了该线程调用了sleep方法、等待输入原因外,还有就是在当前线程中调用了其他线程的join方法、当访问一个对象的方法时,该方法被锁定等。

相应的,当处于BLocked状态的线程在满足以下条件时就会由该状态转到RUNNABLE状态,这些条件是:sleep的线程醒来(sleep的时间到了)、获得了用户的输入、调用了join的其他线程结束、获得了对象锁。

一般情况下,都是处于RUNNABLE的线程和处于RUNNING状态的线程,互相切换,直到运行完run方法,线程结束,进入DEAD状态。

3. JAVA实现多线程的方式

  • 继承Thread类,重写run方法
  • 实现Runnable接口,实现run方法
  • 实现Callable接口,实现call方法(Callable接口与Runnable接口功能类似,但提供了比Runnable更强大的功能)
    • Callable可以在任务结束后提供一个返回值,Runnable无法提供这个功能。  
    • Callable中的call可以抛出异常,而Runnable中的run方法不能抛出异常。

4. 多线程同步的实现方法

当多线程访问同一个资源时,非常容易出现线程安全问题,因此需要采用同步机制来解决这个问题。

(1)synchronized关键字,在Java语言中每个对象都有一个对象锁与之相关联,该锁表明对象在任何时候只允许被一个线程所拥有,当一个线程调用对象的一段synchronized代码时,需要先获取这个锁,然后去执行相应的代码。synchronized主要有两种用法(synchronized代码块和synchronized方法)

   wait()和notify()

   在synchronized代码被执行期间,线程可以调用对象的wait()方法,释放对象锁,进入等待状态,并且可以调用notify()活notifyAll()方法通知正在等待的其他线程。notify仅唤醒一个线程(等待队列中的第一个线程)并允许它去获得锁,notifyAll方法唤醒所有等待这个对象的线程并允许它们去获得(并不是让所有线程都获取到锁,而是让它们去竞争)

http://www.cnblogs.com/dolphin0520/p/3920385.html

(2)Lock:JDK5增加了Lock接口以及它的一个实现类ReentrantLock(重入锁)来实现线程的同步。

 5. Java多线程面试常问:

  • join (父线程的代码需要等待子线程运行完之后才能运行父线程后面的代码,则需要调用子线程的join方法)http://www.open-open.com/lib/view/open1371741636171.html

 

找工作——多线程

标签:

原文地址:http://www.cnblogs.com/java-cjt/p/5245343.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!