黑马程序员---多线程

来源:互联网 发布:des算法c语言实现 编辑:程序博客网 时间:2024/05/18 03:28

------- android培训、java培训、期待与您交流! ----------

线程是什么

    进程:简单理解成一个应用程序.

    线程:是进程的一个独立单元片段,多个线程组成了一个进程.线程在控制着进程的执行.一个进程中至少有一个线程.

    多线程:有多条通路可以执行我们的程序,它提高了我们程序的效率.

    JVM启动时启动了几个线程?

      它在启动时启动了两条线程,一个非守护线程(main线程),第二个(守护线程)垃圾回收线程.

      java是面向对象的语言,java中的县城不是面向对象的.它在处理线程操作时,与C语言相比有明显的缺点.

java中的线程创建方式

    java.lang.Thread类就是java中的线程类.

    我们电脑打开多个程序时,哪一个线程被执行,是由cpu分配时间片来确定的.那么对于我们的多个线程来说,理想状态下是多个线程都是一起执行,

    但是因为硬件的原因,一次只能有一个线程获得时间片,获得时间片的县城才能真正被执行,没有获得时间片的线程,它们排队等待,对于优先级高的线程,

    它就会排在前面,当cpu在分配时间片时,它就会优先执行.

    java中的线程优先级共有10个,默认是5,最高的是10,最低是1.

    java创建有两种方式:

        1.将我们自己的类声明成Thread类的子类  (extends Thread)

        步骤:

            将当前类继承自Thread类

            重写父类中的run方法

            启动线程,调用Thread类中的start方法.

        2.声明自己的类实现Runnable接口.  (implements Runnable)

         步骤:

            创建一个类实现Runnable接口

            将接口中的run方法重写

            启动线程,调用Thread类中的start方法.

    问题:当实现Runnable接口时,怎样启动线程?

       将实现Runnable接口的类的对象作为一个参数传递给一个Thread类对象    new Thread(实现了Runnable接口的对象).start()方法.

    线程中的方法:

    run()方法:作用是用来定义我们自己的线程要执行的内容.

    start()  启动线程

java中启动线程start方法与直接调用run方法的区别

    start方法是JVM重新开辟一条通过,去调用线程类中的run方法的内容.

java中线程的执行无序性

    多个线程在执行时,它的执行顺序是由cpu时间片来分配的,我们无法控制,它的执行结果会产生无序性.

在实际开发中我们选择哪一种方法去创建线程?

    首选接口

    原因:1使用接口可以让我们的程序扩展性更强  一个类只能继承一个父类,但可以实现多个接口.

             2.使用extends Thread类是想使用多个线程操作公共数据

                那么这个数据要是static,如果不是static,而是实例属性,那么代表的是每个线程操作的都是自己的属性.

                static属性的缺点:它的生命周期太长,所占用的内存一直得不到释放

                使用implements Runnable接口时,多个线程在操作公共数据时,这个属性可以是实例属性,因为只有一个实现了Runnable接口的对象.

                要想去创建线程并启动它,是通过new Thread(Runnable runnable)这样的方式去创建线程对象的.

线程中常用的方法

    start: 启动线程

    run: 用来定义线程的执行内容

    设置线程优先级

        public fial void setPriority(int newPriority)更改线程的优先级.

    设置线程的名称与获得现线程的名称:

    setName(String name)  用来设置线程的名称

    String getName()  用来获得县城的名称

    static Thread currentThread();

        功能:得到当前正在执行的线程的引用

        返回值:只在执行的线程的引用

        static方法可以直接通过类名调用

    子线程的默认名称:THread-编号

    主线程的名称:main

    默认的优先级:5

线程的状态

  创建:new 出一个线程对象

  执行:执行run的内容,其实就是cpu将时间片分配给某个线程,它就具有了执行权.

  销毁:线程执行结束,run结束或stop

  冻结:是线程遇到了sleep或wait时由运行变成冻结,当冻结状态结束后不一定回到运行状态,有可能回到临时堵塞状态.

  临时堵塞:当前线程具有执行的资格 ,但是没有执行权,也就是说线程启动了,但是cpu没有分配给它时间片,只能排队等待.

同步线程(线程安全)

  线程安全问题产生的原因:

    多个线程通过多条语句去操作共享数据

  怎样解决线程的安全问题:

    当某一个线程在操作数据时,它没有操作完,就不允许其他线程来操作.只有当这个线程操作结束后,才允许其他线程来操作.我们把这种机制叫做锁的机制.

  线程的同步问题:

    两种解决方式:

        1.使用Synchronized 块

           Synchronized(对象) {

               多条语句操作的数据

              }

          锁的对象可以是任意对象

         2.使用synchronized 方法

  使用同步代码块解决安全问题注意事项

    所有的线程在操作时,姚宝成线程是案例的,必须保证所使用的锁是同一个.

  同步方法:其实就是使用synchronized 去修饰一个方法.

  同步代码块与同步方法的原理是一样的,区别在于它们所控制的范围不一样.同步方法是它将整个方法都锁定,线程没有执行完这个方法,其他线程是不能执行的.

  而同步代码块我们可以控制方法中的某一部分去锁.

  在实际操作中建议使用不同代码块.

同步的弊端:

  多线程的优点:提高效率

  使用同步后就使得多线程程序的效率降低.

死锁:

  死锁是怎样产生的:死锁多个线程互相持有对方锁.

  怎样避免死锁的产生:

    死锁一般出现的原因就是嵌套问题,要想避免产生死锁,就尽量少用嵌套.

 

 

------- android培训java培训、期待与您交流! ----------

 

 

   

 

 

原创粉丝点击