zoukankan      html  css  js  c++  java
  • Java多线程

    ⒈优点

      1.提高应用程序的相应。对图形化界面更有意义,增强用户体验。  

      2.提高计算机系统Cpu的利用率。

      3.改善程序结构,将既长又复杂的进程分为多个线程独立运行,利于理解和修改。

    ⒉分类

      1.Java中的线程分为两类,一种是守护线程,一种是用户线程。

      2.几乎他们在每个方面都是相同的,唯一的区别是判断JVM何时离开。

      3.守护线程是用来服务用户线程的,通过在start()方法前调用thread.setDaemon(true)可以把一个用户线程变成一个守护线程。

      4.Java中的垃圾回收就是一个典型的守护线程。

      5.若JVM中都是守护线程,当前JVM将退出。

    ⒊线程的生命周期

      1.新建:当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态。

      2.就绪:处于新建状态的线程被start()后,将进入线程队列等待cpu时间片,此时它已具备了运行的条件。

      3.运行:当就绪的线程被调度并获得处理器资源时,便进入运行状态,run()方法定义了线程的操作和功能。

      4.阻塞:在某种特殊情况下,被人为挂起或执行输入输出操作时,让出cpu并临时中止自己的执行,进入阻塞状态。

      5.死亡:线程完成了它的全部工作或线程被提前强制性的中止。

    ⒋实现

      1.继承Thread接口,并重写run()方法

     1 package cn.coreqi.thread;
     2 
     3 public class MyThread extends Thread {
     4     @Override
     5     public void run() {
     6         for(int i = 0; i< 100; i++){
     7             System.out.println("name:" + Thread.currentThread().getName() + "number:" + i);
     8         }
     9     }
    10 }
    1 public class Main {
    2     public static void main(String[] args) {
    3         Thread thread = new MyThread();
    4         thread.start();
    5     }
    6 }

      2.实现Runnable接口,并重写run()方法

    1 package cn.coreqi.thread;
    2 
    3 public class MyTask implements Runnable {
    4     @Override
    5     public void run() {
    6         System.out.println("");
    7     }
    8 }
    1 public class Main {
    2     public static void main(String[] args) {
    3         Thread thread = new Thread(new MyTask());
    4         thread.start();
    5     }
    6 }

      对比继承和实现的方式,实现的方式要优于继承的方式

        1.避免了java中单继承的局限性。

        2.如果多个线程之间要同时操作同一份资源(或数据),更适合使用实现的方式。【仍然有线程安全问题】

    ⒌Thread常用方法及线程优先级

      1.start():启动线程并执行相应的run()方法
      2.run():子线程要执行的代码放入run()方法中
      3.yield():一旦执行一个线程的yield 方法, 那么这个线程将会释放cpu 的使用权
      4.join():在A线程中调用B线程的join()方法,表示,当执行到此方法,A线程停止执行,直到B线程执行完毕,A线程再接着join()之后的代码执行。
      5.isAlive():判断当前线程是否还存活。
      6.线程通信:wait() notify() notifyall()
      7.设置线程的优先级

      线程的优先级控制
        1·时间---先到先执行
        2.优先级 --- 高优先级的先执行
        默认: 同等优先级的按照时间(先到先执行),不同优先级的,高优先级的先执行,设置优先级只能保证抢先执行的概率变大了。
        MAX_PRIORITY(10); //最大优先级是10
        MIN_PRIORITY(1); //最小优先级是1
        NORM_PRIORITY(5); //默认优先级是5
      涉及的方法:
        getPriority():返回线程的优先级
        setPriotity():改变线程的优先级
      线程创建时默认继承父线程的优先级
     
    ⒍线程安全
      1.原因
        由于一个线程在操作共享数据的过程中,还未执行完毕的情况下,另外的线程参与了进来,导致共享数据存在了安全问题。
      2.解决
        必须要让一个线程操作共享数据完毕以后,其他线程才有机会参与共享数据的操作,使用Java线程的同步机制。
        1.同步代码块
          synchronized(同步监视器){
            //需要被同步的代码块(即为操作共享数据的代码)
          }
          ①共享数据:多个线程共同操作的同一个数据(变量)
          ②同步监视器:由一个类的对象(任何一个类)来充当,哪个线程获取此监视器,谁就执行大括号里面被同步的代码。俗称:锁。要求,所有线程必须共用一把锁
                注:在实现的方式中,考虑同步的话,普通的方法可以使用this来充当锁。静态方法而言,可以使用当前类本身充当锁。但是在继承的方式中,慎用。
                  
        2.同步方法
          将操作共享数据的方法声明为synchronized。即此方法为同步方法,能够保证当其中一个线程执行此方法时,其它线程在外等待直到此线程执行完此方法。
          public synchronized void methodName(){
            //需要被同步的代码块(即为操作共享数据的代码)
          }
          同步方法的锁:this

     ⒎那些情况下将会释放锁

      1.当前线程的同步方法或同步代码块执行结束

      2.当前线程在同步代码块或同步方法中遇到break、return终止了该代码块、该方法的继续执行

      3.当前线程在同步代码块、同步方法中出现了未处理的Error或Exception,导致异常结束。

      4.当前线程在同步代码块、同步方法中执行了线程对象的wait()方法,当前线程暂停,并释放锁。

    ⒏那些情况下不会释放锁

      1.线程执行同步代码块或同步方法时,程序调用Thread.sleep()、Thread.yield()方法暂停当前线程的执行。

      2.线程执行同步代码块时,其他线程调用了该线程的suspend()方法将该线程挂起,该线程不会释放锁(同步监视器)

      *应尽量避免使用suspend()和resume()来控制线程。

    ⒐线程的死锁问题

      不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁

      解决方法:

        1.专门的算法、原则

        2.尽量减少同步资源的定义

    ⒑线程通信

      1.wait():令当前线程挂起并放弃Cpu、同步资源,使别的线程可访问并修改共享资源,而当前线程排队等候再次对资源的访问。

      2.notify():唤醒正在排队等待同步资源的线程中优先级最高的结束等待。

      3.notifyAll():唤醒正在排队等待资源的所有线程结束等待。

      *这三个方法由Object提供,只能在同步方法或同步代码块中使用,否则抛出java.lang.IllegalMonitorStateException异常

  • 相关阅读:
    Lucas定理及其应用
    HDU 5044 TREE
    HDU 5033 Building
    Codeforces Round #238 (Div. 1)
    hdu 4878 ZCC loves words AC自动机+中国剩余定理+快速幂
    HDU 5015 233 Matrix
    HDU 5008 Boring String Problem
    ZOJ 3817 Chinese Knot
    使用AutoMapper
    多租户概念以及FreeLink多租户设计思想
  • 原文地址:https://www.cnblogs.com/fanqisoft/p/10937962.html
Copyright © 2011-2022 走看看