zoukankan      html  css  js  c++  java
  • 二.3 java高级-多线程

    一,线程概述

    1.进程:正在运行的程序

    2.线程:进程中同时运行的多个执行单元

    关键字:共享资源,

    3.多线程可以使:多段程序代码交替运行(一段程序代码可以看做一个子任务

    二,线程的创建

    1.继承Thread类,重写run()方法

    (1)创建代码

      创建任务的同时创建线程

    MyThread thread1=new MyThread(“thread1”);    
    MyThread thread2=new MyThread(“thread2”);

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

    (1)创建代码

      创建任务和创建线程分离

    MyThread myThread=new MyThread();  //多了步创建继承类的实例对象
    Thread thread1=new Thread(myThread,“thread1”);
    Thread thread2=new Thread(myThread,“thread2”);

    3.实现Callable接口,重写call()方法,并使用Future来获取call()方法的返回结果

    (1)创建代码

    MyThread myThread=new MyThread();
    
    FutureTask ft1=new FutureTask(myThread);    //多了部包装
    Thread thread1=new Thread(ft1,“thread1”);
    
    FutureTask ft2=new FutureTask(myThread);
    Thread thread2=new Thread(ft2,“thread2”);

    三种实现方法对比:

    (2)每种方法都比前一种多了一步

    (2)实现Runnable或Callable 适合多个线程去处理同一个共享资源的情况,将线程同程序代码、数据有效分离

        继承Thread无法资源共享。故只能创建一个售票程序,然后开启多个线程去共享同一个售票对象的售票方法,即让4个线程运行同一个售票程序

    (3)避免java单继承带来的局限性

    三.线程的生命周期及状态转换

    四.线程的调度

     join(),sleep(timeout),yield()都是Thread类的方法

    1.定义:java虚拟机为线程分配CPU的使用权

    2.分时调度模型/抢占式调度模型。java虚拟机默认采用抢占式调度模型

    3.线程的优先级

    (1)优先级越高获得CPU的机会越大

    4.线程休眠 Thread.sleep(long millis)

    (1)定义:使正在执行的线程暂停,把CPU让给其他线程

    (2)Running--->Timed_Wating--->Ready  休眠时间完了才会进入Ready状态,才有机会获得CPU

    5.线程让步 Thread.yield()

    (1)与线程休眠的区别:不会阻塞该线程,只是将线程直接转换到Ready状态,让系统的调度器重新调度

    6.线程插队 thread2.join()

    五.多线程同步

    (多线程去访问同一个资源,也会引发一些安全问题)

    (前面通过实现Runnable接口的方式,并不能完全解决线程同步问题)

    定义:为了解决线程安全问题,限制某一资源在同一时刻只能被一个线程访问

    1.线程安全

    解决:处理共享资源的代码在任意时刻只能有一个线程访问

    2.同步代码块  synchronized(lock)

    3.同步方法   修饰符synchronized

    4.同步锁    Lock lock(lock.lock(),lock.unlock())

    5.死锁问题

    六.多线程通信  wait()/notify(),notifyAll()

    (1)wait()  使当前线程进入等待状态

        notify()/notifyAll() 唤醒当前处于等待状态的线程  

    七.线程池

    续:

    1.wait和sleep的区别

    (1).调用wait()方法会释放对象的锁。因此wait方法一般被用于同步方法或者同步代码块中

    (2).与wait方法不同的是,sleep方法不会释放当前占有的锁

    2.多线程中,为了保证数据的一致性,通常需要在使用对象或者方法前加锁

    3.同步块是访问共享资源的代码块。给共享资源上了个锁

  • 相关阅读:
    用 Java 通过串口发送手机短信(二)简单使用
    jquery.lazyload.js实现图片延迟加载——wordpress图片随滚动条渐显效果
    java的mysql连接池
    html5客户端本地存储之sessionStorage及storage事件
    flash chart(amCharts的破解)
    实现igoogle效果的两种方法比较
    “SQL Server (SQL2005) 服务因 126 (0x7E) 服务性错误而停止”的解决方法 
    一个超简单的方法验证文本框中内容的数据类型
    我的对联
    Ajax调用后类方法时报”对象未定义“错误解决方法
  • 原文地址:https://www.cnblogs.com/midiyu/p/15125610.html
Copyright © 2011-2022 走看看