zoukankan      html  css  js  c++  java
  • 关于java线程的一些了解

                          

    进程:就是正在运行的程序,分配内存让应用程序能够运行

    Windows系统号称多任务(可以同时运行多个应用程序)

       宏观上看:windows确实是允许多个程序

       微观上看:CPU快速切换执行任务,由于速度特别快,我们人感觉不到这个切换的过程

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

     疑问:没有学习线程,为什么代码可以执行

          Java程序在运行的时候,jvm会帮我们创建一个主线程来执行代码。主线程主要负责main方法中的代码执行

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

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

    多线程:在一个进程中多个线程同时执行不同的任务。“同时”:单核CPU快速切换多线程执行任务,速度特别快,感觉不到切换

    多线程的好处:

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

    2.提高资源的利用率

    多线程的弊端:

    1.增加CPU的负担,不是线程越多越好

    2.降低了一个进程中线程的执行概率

    3.线程容易引发线程安全问题

    4.容易出现死锁现象

    Java中创建线程的两种方式:
     方式一:Thread(线程类)

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

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

        每一个线程都会有自己的任务代码,jvm创建的主线程的任务代码就是main方法,自定义的线程的任务代码就写在run方法中

           3.创建Thread的子类,并且调用start方法开启线程

      注意点:一旦线程开启了,会默认执行线程对象中的run方法,但是千万不要自己直接调用run方法,如果直接调用run方法就和普通方法没什么区别

       线程的生命周期:

    创建:新创建了一个线程对象。

    可运行:线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取cpu的执行权。

    运行:就绪状态的线程获取了CPU执行权,执行程序代码。

    阻临时塞: 阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。

    死亡:线程执行完它的任务时。

      线程中常用的方法:

         Thread(String name)  初始线程的名字

         getNema()            返回线程的名字

         setNema(String name) 设置线程对象名

         Sleep()              线程睡眠的指定毫秒数

         getPriority()返回当前对象的优先级  默认线程的优先级是5

         setPriority(int newPriority) 设置线程的优先级 虽然设置可优先级,但是具体的实现取决于底层的操作系统的实现 (优先级最大的是 10,最小的是1,默认的是5)

    currentThread()       返回CUP正在执行的线程的对象

     

    对于线程不安全的解决方法:
      java给线程加锁:

       方式一:同步代码块

     锁对象可以是任意一个java中的对象(任意类型的对象)

     Java中的任意一个对象都会有一个对象的状态,就可以通过对象的状态作为锁的一个标识符   

    列如:  statue = 0 表示锁关闭  statue=1表示打开

     Synchronized(锁对象){   }

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

          1.任意一个对象都可以做锁对象

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

          3.只有正真的存在线程安全的时候才需要使用同步代码块,

    否则会降低执行效率

          4.多线程操作锁对象必须是唯一,否则无效

    不知道线程什么时候安全什么时候不安全?

      出现线程安全的问题根本原因:

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

    2.多个语句操作共享资源

     方式二:同步函数:用关键字synchronized 修饰函数

       同步函数是有锁对象的
      同步函数的使用是一个静态函数注意点:

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

          2.同步函数的锁对象是固定的,不能够自己指定

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

    同步代码块和同步函数中,优先使用同步代码块     

         原因:

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

         2.同步代码块可以控制被同步范围,同步函数必须是整个函数的所有代码都被同步

    线程死锁现象问题:

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

    死锁现象的解决方法:没有方案,尽量避免

     

    线程的定义方式二:

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

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

         3.创建Runable接口的实现对象

         4.创建一个Thread对象,并且把Runable实现类创建的对象作为参数

         5.调用Tread对象的star方法来开启线程

    问题:为什么要将Runable接口实现类的对象作为参数传递?

       为了让对象中的run方法能够在线程中的run方法中执行,也就是能够将这个对象中的run方法作为线程中的任务来执行

    方法Thread和Runable 推荐使用Runable

    Java是单继承,就不能够继承Thread对象来实现多线程

    线程的通讯:一个线程完成自己的任务,去通知另外一个线程去完成另一个任务

     wait();  等待 如果线程执行了wait方法,那么该线程就会处于一个等待状态,等待状态的线程必须要通过其他线程来调用notify()方法来唤醒

     notify(); 唤醒  随机唤醒线程池中的一个线程

     notifyAll();唤醒所有的线程

    wait和notify的使用注意点:

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

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

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

  • 相关阅读:
    ASP.NET程序中常用的三十三种代码【转】
    BTree,BTree,B+Tree,B*Tree都是什么
    调用Google地图
    JS特效总结
    2005 加入博客园
    .net Windows服务程序安装与安装程序的制作
    七夕,爱似流年
    JS+CSS仿魔兽游戏进入进度条特效
    常用正则表达式
    Google翻译网站添加Google翻译,让老外也看的懂你的网站
  • 原文地址:https://www.cnblogs.com/qi-dian/p/6127242.html
Copyright © 2011-2022 走看看