黑马程序员技术交流社区

标题: 多线程总结(上) [打印本页]

作者: 杨立考    时间: 2013-1-10 09:36
标题: 多线程总结(上)
多线程
  什么是线程?

  进程:可以简单理解成就是一个应用程序.
  多个线程组成了一个进程.
  进程与进程之间不可能进行通信,但是同一个进程中的线程可以进行通信.

  我们使用多线程 程序目的就是为了提高效率.
  多线程程序相当于拥有多条通路去执行。
JVM在启动时是单线程还是多线程的?

  JVM在启动时是多线程。一共启动了两个线程
  1.非守护线程  (其实就是我们的main方法,也叫做主线程)
  2.守护线程 (垃圾回收) 它的作用用来清理堆内存中存在的没有引用指向的对象
                       它调用就是finalize方法
多线程是java中的一项技术
java中的多线程不是面向对象的。

java中怎样实现多线程(面试题)
首行知道:java.lang包下的所有类在使用时不需要导包.
java.lang.Thread  这个类就是java中的线程类.

  阅读帮助文档
  1.发现java中的线程有10个优先级,默认优行级为5.最高为10,最低为1
  2.java中创建线程有两种方式
   
   2.1 第一种是继承 Thread类,重写run方法
    创建线程  创建我们自定义类的对象
    启动线程  调用从Thread类中继承的start方法
   步骤
   1.继承Thread
   2.重写run方法  
   通过查看帮助文档发现 Thread类中的run方法中没有任何内容,只是告诉我们子类要重写这个方法
   3.创建线程对象,并启动线程


  run方法作用: 要执行的子线程的内容。
  start作用:   启动线程  jvm重新开辟运行通信
多线程程序的无规则性
  根据这个程序的结果,发现main或run内容谁先执行,谁先执行多少个
  这个是规律的,这个叫多线程程序的无序性.
  为什么出现这种情况,是因为cpu在执行时,我们控制不了cpu的时间片
  分配,分配给哪一个线程,哪个线程就执行。



  创建线程的第二种方式
  2.2 实现Runnable接口
   Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。
  步骤
  1.创建类去实现Runnable接口
  2.Runnable接口中定义了一个run方法,必须重写
  3.启动线程  将实现了Runnable接口类的对象做为参数传递给Thread构造方法,
    这样在通过Thraed对象去调用start方法时,就知道应该执行哪个run。
    例如  new Thread(实现Runnable接口对象).start();
  第一种方式实现
  MyThread mt=new MyThread();
  mt.start();
  如果我们没有在自定义类中重写run方法,那么父类中run方法没执行任何内容
  这不是我们想要的,我们只有在自定义类中重写run,完成我们想要的功能
  */

  /*
  //第二种实现
  MyRunnable mr=new MyRunnable();
  new Thread(mr).start();
  这时调用的是我们实现Runnable接口中的run方法的内容.
Thread类中常用的方法
  1.String getName()  得到线程的名字
  2.void setName()  设置线程的名称
  3.static Thread currentThread()  得到当前正在运行的线程的对象的引用
  
  4.了解 String toString()  线程对象的字符串表示形式  包括  线程名 优先级 线程组。
  5.static void sleep(long millis) 让当前线程睡眠millis毫秒


关于创建线程的两种方式区别
  建议使用哪一个
  
  1.extends Thread
  2.implements Runnable
  建议使用第二种,为什么?
  
  1.java中支持多实现,而不支持多继承。
    如果使用了继承,那么我们程序的可扩展性下降,因为一个类只能有一个父类
    使用实现,我们可以实现多个接口,不影响我们程序的扩展性。

  2.关于数据共享
   
    2.1如果使用继承Thread类来实现数据共享,那么这个数据要static,
    它的生命周期太长.
   
    2.2如果使用实现Runnable,这时候只需有一个实现Runnable对象将其传递给
       Thread类的构造方法,就可以实现多个线程操作同一个数据。
多线程程序的几种状态
  1.创建状态
  2. start 启动 运行状态
  3.冻结
  4.销毁  1. 线程结束  run运行结束  2.调用stop()不建议使用
  5.临时堵塞状态




多线程程序存在安全问题?
当一个线程在执行过程中,如果没有执行完,那么其它的
线程给我等待,当前线程执行完成后,其它的线程才允许
去执行内容,这样就可以解决这个线程安全问题.
代码实现  我们可以使用synchronized关键字来操作。
让线程进行同步
怎样使用
同步代码块
  
  格式 synchronized(任意对象){
   
    内容
       }
相当于加了锁,也就是说当前线程没有执行完内容,
这把锁不会释放,其它线程想要执行,必须得到锁才
可以执行。
也可以使用另外一种方式进行同步
  同步方法  就是在执行的方法上用synchronized进行修饰

但是它降低了多线程程序的效率.
同步什么时候使用?
  
  1.多线程时使用同步
  2.在线程执行的内容中,操作了共享数,并且是多条件语句操作,这时就需要同步

同步使用时要注意的问题?
  我们必须保证想要同步的这些线程所使用的锁的对象必须是
  同一个。

  同步方法,如果方法是实例方法,那么它默认所使用的锁是 this
如果同步方法是静态的方法,那么它默认所使用的锁的 类名.class 对象.





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2