面试题汇总—JavaSE之多线程.doc_第1页
面试题汇总—JavaSE之多线程.doc_第2页
面试题汇总—JavaSE之多线程.doc_第3页
面试题汇总—JavaSE之多线程.doc_第4页
面试题汇总—JavaSE之多线程.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 同步的实现方面有两种,分别是synchronized,wait与notify2、线程的基本概念、线程的基本状态以及状态之间的关系线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。Java中的线程有四种状态分别是:运行、就绪、挂起、结束。 3.java中多线程应用和详解进程:是指运行中的应用程序,每个进程都有自己独立的内存空间,一个应用程序可以同时启动多个进程。如针对IE浏览器的程序,每打开一个IE浏览器窗口,就启动了一个新的进程。同样,每次执行jdk的java.exe程序,就启动一个独立的java虚拟机进程,该进程的任务就是解析并执行java程序代码。线程:是指进程中的一个执行流程,一个进程可以由多个线程组成,即在一个进程中可以同时运行多个不同的线程,他们分别执行不同的任务。当进程内多个线程同时运行时,这种运行方式称为并发运行。许多服务器程序比如数据库服务器,web服务器,都支持并发运行,这些服务器能同时相应来自不同客户的请求。 线程和进程的主要区别在于:每个进程都需要为其分配独立的内存地址空间,而同一进程中的所有线程在同一块地址空间中工作,这些线程可以共享同一块内存和系统资源,比如共享一个对象或者共享已经打开的一个文件。 java线程的运行机制: 在java虚拟机进程中,执行程序代码的任务是由线程来完成的。每个线程都有一个独立的程序计数器和方法调用栈。 程序计数器:也称为pc寄存器,当线程执行一个方法时,程序计数器指向方法区中下一条要执行的字节码指令。 方法调用栈:简称方法栈,用来跟踪线程运行中一系列的方法调用过程,栈中的元素称为栈幀,每次线程调用一个方法的时候,就会向方法栈压入一个新幀。幀用来存储方法的参数、局部变量和运算过程中的临时数据。 下面通Sample介绍线程的运行过程 public class Sample private int a; public int method() int b=0; a+; b=a; return b; public static void main(String args) Sample s=null; int a=0; s=new Sample(); a=s.method(); System.out.println(a); 讲解:主线程从main()方法的程序代码开始运行,当主线程执行a+操作时,它栈数据区中的有关信息,正确定位到堆区的Sample对象的实例变量a,并把它的值加1,当method()方法执行完毕后,它的栈幀就会从方法中弹出,局部变量b结束生命周期,main()方法的栈幀成为当前幀,主线程继续执行main()方法,下面讲一下java中的各个区。 方法区:存放Sample类的数据结构和线程所执行的字节码指令。堆区:存放线程所操作的数据(以对象的形式存放) 栈去:是线程的工作区,保存线程的运行状态和对象的引用 另外,计算机中指令的真正执行者是cpu,线程必须获得cpu的使用权,才能执行一条指令。线程的创建和启动: 用户创建线程的方式有两种如下:1.扩展java.lang.Thread类 2.实现Runnable接口 第一种方法代码如下: public class Machine extends Thread public void run() System.out.println(run); public static void main(String args) Machine machine=new Machine(); machine.start(); 讲解:当运行java Machine命令时,java虚拟机首先创建并启动主线程。主线程的任务是执行main()方法,main()方法创建了一个Machine对象,然后调用它的start()方法启动Machine线程。Machine线程的任务是执行它的run()方法。 主线程与用户自定义线程并发运行: public class Machine extends Thread public void run() for(int a=0;a50;a+) System.out.println(currentThread().getName()+:+a); try sleep(100); catch(InterruptedException e) throw new RuntimeException(); public static void main() Machine machine1=new Machine(); Machine machine2=new Machine(); machine1.start(); /启动第一个Machine线程 machine2.start(); /启动第二个Machine线程 Machine1.run(); /主线程执行第一个Machine对象的run()方法 讲解:在java虚拟机中有三个线程并发执行Machine对象的run()方法。在三个线程各自的方法栈中都有代表run()方法的栈幀,在这个幀中存放了局部变量a,每个线程都有自己的局部变量a,它们都分别从0增加到50。 sleep()方法,该方法让当前线程放弃cpu并且睡眠若干时间,让每个线程轮流获得cpu的使用权。 多线程共享同一个对象的实例变量: public class Machine extends Thread private int a=0; public void run() for(a=0;a50;a+) System.out.println(currentThread().getName()+:+a); try sleep(100); catch(InterruptedException e) throw new RuntimeException(e); public static void main(String args) Machine machine=new Machine(); machine.start(); machine.run(); 讲解: 当主线程和Machine线程并发执行Machine对象的run()方法时,都会操纵同一个实例变量a,也就是说两个线程会轮流给变量a加1。线程的状态转换: 线程在它的生命周期中会处于各种不同的状态。4、具体可分为以下几种 1.新建状态,和其他java对象一样,仅仅在堆区中被分配了内存。 2.就绪状态,当一个线程对象创建后,其他线程调用它的start()方法,该线程就进入就绪状态,java虚拟机会为它创建方法调用栈和程序计数器,处于这个状态的线程位于可运行池中,等待获得cpu的使用权。 3.运行状态,处于这个状态的线程占用cpu,执行程序代码,在并发运行环境中如果计算机只有一个cpu,那么任何时刻只会有一个线程处于这个状态,如果有多个可以让几个线程占用不同的cpu,只有处于就绪状态的线程才有机会转到运行状态。 4.阻塞状态,指线程因为某些原因放弃cpu,暂时停止运行,当线程处于阻塞状态java虚拟机不会给线程分配cpu,直到线程重新进入就绪状态,它才有机会转到运行状态 阻塞状态可以分为一下3种(a).位于对象等待池中的阻塞状态 (b).位于对象锁池中的阻塞状态 (c).其他阻塞状态 当一个线程执行System.out.println();或者System.in.read()方法时,就会发出一个io请求,该线程放弃cpu,进入阻塞状态,直到io请求处理完毕,该线程才恢复运行。5.死亡状态,当线程退出run()方法时,就进入了死亡状态,该线程结束生命周期,不管线程正常结束还是异常结束,都不会对其他线程造成影响。5.多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 同步的实现方面有两种,分别是synchronized,wait与notify6.启动一个线程是用run()还是start()?启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。7.sleep() 和 wait() 有什么区别?sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。wait()方法被调用时会解除锁定,但是我们能使用它的地方只是在一个同步的方法或代码块内wait()/notify():调用任意对象的 wait() 方法导致线程阻塞,并且该对象上的锁被释放。而调用 任意对象的notify()方法则导致因调用该对象的 wait() 方法而阻塞的线程中随机选择的一个解除阻塞(但要等到获得锁后才真正可执行)。8.synchronized和wait()、notify()的关系:1.有synchronized的地方不一定有wait,notify 2.有wait,notify的地方必有synchronized.这是因为wait和notify不是属于线程类,而是每一个对象都具有的方法,而且,这两个方法都和对象锁有关,有锁的地方,必有synchronized。另外,请注意一点:如果要把notify和wait方法放在一起用的话,必须先调用notify后调用wait,因为如果调用完wait,该线程就已经不是current thread了。注:调用wait()方法前的判断最好用while,而不用if;while可以实现被wakeup后thread再次作条件判断;而if则只能判断一次;9.同步和异步有何异同,在什么情况下分别使用他们?举例说明。如果数据将在线程间共享。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论