关闭

java多线程要点

标签: java多线程并发
108人阅读 评论(0) 收藏 举报
分类:

知识点:
一、线程创建两种方式以及优缺点,线程启动
二、线程的状态及转换(线程的生命周期)
三、线程调度和优先级
四、线程常见名词
五、线程同步和死锁
六、线程通信
七、线程组和未处理的异常
八、Callable,Future,FutureTask
九、线程池
十、线程相关类(ThreadLocal,同步容器,并发容器,阻塞队列,Timer和TimerTask)
十一、并发编程之AQS、CAS

1.线程、进程和程序有何区别和联系?
线程与进程区别:
1》线程是进程的一部分;
2》一个进程内可以拥有多个线程;
3》系统在运行的时候会为每个进程分配不同的内存区域,但不会为线程分配内存;
4》与进程的控制表PCB相似,线程也有自己的控制表TCB;
5》进程是系统分配资源的一个基本单位,并不依赖线程而独立存在。
进程与程序的区别:
一个进程一定与一个程序相对应,并且只有一个,但是一个程序可以有多个进程,或者一个进程也没有。
除此之外,进程还有并发性和交往性。

2.如何创建和启动一个线程?
1》继承Thread类。

  public class MyThread extends Thread{
          public static void main(String[] args){
               new MyThread().start();
          }

          public void run(){
             for(int i=0;i<10;i++){
                System.out.println(""+(i+1));
             }
          }
    }

2》实现Runnable接口。

    public class MyThread implements Runnable{
          public static void main(String[] args){
               new Thread(new MyThread()).start();
          }

          public void run(){
             for(int i=0;i<10;i++){
                System.out.println(""+(i+1));
             }
          }
    } 

3.线程的基本状态有哪些?它们之间有何关系?
1》新建状态(New):当一个线程对象成功创建,还没有调用start()方法。
2》可运行状态(Runnable):当线程有资格运行,但调度程序还没有把它选定为运行线程。当start()方法被调用后,线程进入
可运行状态。
3》运行状态(Running):线程调度程序从可运行池中选择一个线程作为当前线程时该线程则处于运行状态。
4》阻塞状态(Blocked):这是当线程遭遇异常或者人为的sleep()、wait()方法等操作时所处的一种临时状态。在此状态下的
线程依然是活的,但是当前条件不允许其运行,如果某种时间出现,它便有可能返回可运行状态。
5》死亡状态(Dead):当线程run()方法中的处理过程全部完成之后便认为该线程处于死亡状态。虽然该线程对象也许是活的,但是其已经不是一个
可以执行的线程,程序员可以显示将其置为null等待垃圾回收器回收。

注意:调用stop()或destroy()方法也会使当前线程处于死亡状态,但是这种用法不被推荐,前者会产生异常,后者是强制终止,不会释放线程锁。
线程一旦死亡,就不能复生,如果在一个死去的线程上调用start()方法,就会抛异常。

4.什么是线程优先级?线程依据什么原则调度执行?
Java中将线程优先级分为了10个等级,分别用数字1~10表示,数字越大表明线程优先级越高。
在Thread类中定义了表示线程优先级最高、最低和普通的成员变量MAX_PRIORITY、MIN_PRIORITY和NORMAL_PRIORITY,代表的优先等级
分别为10、1和5。当一个线程被创建时,其默认的优先等级为5。
在多个线程处于就绪状态下,高优先级的线程优先被执行。但是在java线程技术中,通常是以抢占式调度模式进行的,而不需要时间片分 配进程,因此在使用时间片的

windows系统中,出现低优先级线程抢占高优先级线程的时间片的情况不可避免。

5.什么是后台线程?如何创建一个后台线程?
java中有一种比较特殊的线程,被称为守护线程(Daemon),这种线程具有最低的优先级,用于为系统中其他对象或线程提供服务。
将一个用户线程设置为守护线程的方法是在调用线程对象start()方法之前调用setDaemon(true)方法。

6.如何使正在运行的线程在指定时间内休眠?
1》Thread.sleep(2000);使当前线程休眠2s
2》Thread.sleep(0,100);使当前线程休眠100ns

7.如何终止一个正在运行的线程?
使用Thread.isInterrupted()和Thread.interrupt()就可以安全终止线程。
注意:通常情况下,都是使用标志位来控制run()方法正常结束,而不使用Thread类中的方法,这是因为涉及多线程通信时,很容易
造成不安全性和出现异常。

8.为何stop()和suspend()方法不推荐使用?
1》stop()方法是一种粗暴的终止行为,在线程终止之前没有进行任何清理动作,具有固定的不安全性。
2》suspend()方法具有固有的死锁倾向。

9.如何控制线程的暂停和启动?
1》sleep()方法,此方法在应用时可能会出现偏差,休眠结束后线程返回可执行状态,而不会立即执行。如果对一个正在sleeping的
线程调用interrupt()方法中断时会抛出异常。
2》wait()和notify()方法,wait()使线程进入阻塞状态,有两种形式,一种是指定一段时间作为参数,另一种没有参数。
前者当notify()被调用或者超出指定时间时线程重新进入可执行状态,后者则必须对应的notify()被调用才能重新进入可执行状态。
3》yield()方法,此方法可以使当前线程放弃分得的cpu时间,但是不会使得线程阻塞,线程仍然处于可执行状态,随时可能再次分得
cpu时间。
4》join()方法,此方法允许指定一个以毫秒为单位的参数,表示等待该线程终止的最长时间,如果没有参数则表示等待该线程执行完毕,再调度其他线程。但是如果另一个线

程中断了当前线程,则会抛出异常。

10.如何实现线程同步?
1》synchronized关键字
2》Lock的使用
3》Metux互斥体的设计和使用
4》ThreadLocal的设计和使用,ThreadLocal并不能替代同步机制,同步机制是为了同步多个线程对相同资源的并发访问,是多个线程
进行通信的有效方式,而ThreadLocal是隔离了多个线程的数据共享,从根本上就不在多个线程上共享资源,这样就不需要进行同步。

11.常见线程名词解释
主线程:JVM调用程序main()所产生的线程。
当前线程:这个是容易混淆的概念。一般指通过Thread.currentThread()来获取的进程。
后台线程:指为其他线程提供服务的线程,也称为守护线程。JVM的垃圾回收线程就是一个后台线程。用户线程和守护线程的区别在于,是否等待主线程依赖于主线程结束而结束
前台线程:是指接受后台线程服务的线程,其实前台后台线程是联系在一起,就像傀儡和幕后操纵者一样的关系。傀儡是前台线程、幕后操纵者是后台线程。由前台线程创建的线

程默认也是前台线程。可以通过isDaemon()和setDaemon()方法来判断和设置一个线程是否为后台线程。

线程类的一些常用方法:
  sleep(): 强迫一个线程睡眠N毫秒。
  isAlive(): 判断一个线程是否存活。
  join(): 等待线程终止。
  activeCount(): 程序中活跃的线程数。
  enumerate(): 枚举程序中的线程。
currentThread(): 得到当前线程。
  isDaemon(): 一个线程是否为守护线程。
  setDaemon(): 设置一个线程为守护线程。(用户线程和守护线程的区别在于,是否等待主线程依赖于主线程结束而结束)
  setName(): 为线程设置一个名称。
  wait(): 强迫一个线程等待。
  notify(): 通知一个线程继续运行。
  setPriority(): 设置一个线程的优先级。

参考资料:http://www.cnblogs.com/dolphin0520/p/3920357.html
http://blog.csdn.net/evankaka/article/details/44153709

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:21172次
    • 积分:834
    • 等级:
    • 排名:千里之外
    • 原创:51篇
    • 转载:88篇
    • 译文:0篇
    • 评论:5条
    最新评论