java多线程

Java线程java

Java
windows

 

1.进程安全

 进程:就是正在运行的程序,分配内存让应用程序可以运行。多线程

Windows系统号称多任务(能够他同时运行多个应用程序).jvm

  宏观上看:windows确实是容许了多个程序。函数

  微观上看:cpu快速切换执行任务,因为速度特别快,咱们人感受不到这个切换的过程。学习

 

2.线程:线程在一个进程中负责代码的执行,就是一个进程中的执行路径。this

  疑问:没有学习线程,为何代码能够执行?spa

      答:java程序在运行的时候,jvm会帮咱们建立一个主线程来执行代码。主线程主要负责main方法中的代码执行。线程

一个java程序中至少有2个线程:

   一个是主线程只要负责main方法中的代码执行,一个垃圾回收器线程,负责垃圾回收。

 

3.多线程:在一个进程中多个线程同时执行不一样的任务。"同时":单核cpu快速切换多个线程执行任务,速度特别快感受不到切换。

  多线程的好处:

    1.解决一个进程中同时执行多个任务的问题。

    2.提升资源的利用率。、

  多线程的弊端:

    1.增长cpu的负担。不是线程越多越好。

    2.下降了一个进程中线程的执行。

    3.容易引起线程安全问题。

    4.出现死锁现象。

 

  //java中建立线程有两种方式:

       方式一:Thread(线程类)

         1.须要定义一个类来继承Thread类

         2.重写thread类中run方法,把自定义线程的任务代码写在run方法中.

           每个线程都有本身的任务代码.jvm建立的主线程的任务代码就是main方法,自定义的线程的任务代码就写在run方法中,自定义的线程就须要来执行run方法中的代码,

         3.建立Thread的子类,而且调用start()方法开启线程

 

注意点:一旦线程开启了,会默认执行线程对象中的run方法,可是千万不要本身直接调用run方法,若是直接调用了run方法就和普通方法没有区别

 

java给线程加锁:

  方式一:同步代码块

         //锁对象能够是任意一个java中的对象

         //java中的任意一个对象都会有一个对象的状态,就能够经过对象的状态来做为锁的一个标识符.

         //statue = 0 表示锁是关闭 statue = 1 表示锁打开

          synchronized(锁对象){}

          同步代码块的使用注意点:

            1.任意一个对象均可以作锁对象

            2.若是你在同步代码块中调用了sleep方法,不会释放锁对象。

            3.只有真正的存在线程安全的时候才须要使用同步代码块,不然会下降执行效率。

            4.多线程操做锁对象必须是惟一的,不然无效。

 

    不知道何时安全,何时不安全?

    答:出现线程安全的问题根本缘由:

          1.存在两个或两个以上的线程.而且线程之间共享着一个资源.

          2.多个语句操做了共享资源

  方式二:同步函数:

          用关键字synchronized 修饰函数

   同步函数是否有锁对象:有的.

            同步函数使用注意点:

              1.若是是一个非静态的函数,同步函数的锁对象就是调用方法的对象(this对象),若是是一个静态函数同步函数的锁对象是当前函数所属类的字节码文件(class对象).

              2.同步函数的锁对象固定,不可以本身来指定.

              3.同步函数是同步整个函数的代码.

 

           推荐你们使用:同步代码块.

           缘由:

               1.同步代码块的锁对象能够由我任意指定,同步函数是固定的.

               2.同步代码块能够控制被同步的范围,同步函数必须是整个函数的全部代码都被同步.

           

    代码同步是能够解决线程安全问题,可是若是使用不当会致使线程死锁问题:

       A线程等B线程完成,B线程又在等A线程,结果两我的就一直等下去,这个时候形成了线程死锁.

 

线程死锁不必定会出现,有可能会出现.

  死锁对象的解决方案:没有方案,尽可能避免发生.

 

     线程的定义方式二:

       1.自定义一个类实现Runable接口,接口中就会提供一个run方法

        2.实现Runable接口中的run方法.将线程中的任务写在run方法中

        3.建立Runable接口的实现类对象.

        4.建立一个Thread对象,并把Runable实现类建立的对象做为参数.

        5.调用Thread对象的start方法来开启线程

 

   问题:为何Runable接口实现类的实现类的对象做为参数传递?

    为了让对象中的run方法可以在线程中的run方法中执行,也就是可以将对象中的run方法最为线程中的任务来执行.

推荐使用:第二种方式 实现Runable.

 

 

4.线程的通信:一个线程完成本身的任务,去通知另一个线程去完成另一个任务.

    wait();等待 若是线程执行了wait方法,那么该线程就会处于一个等待状态,等待状态的线程必需要经过其余线程来调用notify方法来唤醒。

notify();唤醒 随机唤醒线程池。

notifyAll();唤醒全部等待的线程。

 

生产者和消费者.

wait和notify的使用注意点 :

    1.wait方法和notify方法是属性Object对象

    2.wait方法和notify方法必须在同步线程中执行

    3.wait方法和notify方法必须有锁对象来调用

相关文章
相关标签/搜索