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

    应用程序的执行实例      进程   有独立的内存空间和系统资源 是一次程序的执行,

    Cpu调度和分派的基本单位  线程 过程中执行运算的最小单位,可完成一个独立顺序控制流程

    什么是多线程
    如果在一个进程中同时运行了多个多线程,用来完成不同的工作,则称为"多线程"
    多个线程交替占用Cpu资源,而非真正的并行执行

    线程 是执行运算的最小单位
    进程 是一次程序的执行 是一次 程序的活动
    多线程 就是同时有多个线程执行 ,共同维护程序中的数据
     
    多线程好处
    充分利用CPU的资源
    简化编程模型
    带来良好的用户体验

    Thread类
    Java 提供了Java.lang.Thread类支持多线程编程
    主线程
    main()方法为主线程入口
    产生其他子线程的线程
    必须最后完成执行,因为它执行各种关闭动作

    继承Thread类
    编写简单,可直接操作线程
    适用于单继承
    实现runnable接口
    避免单继承局限性
    便于资源共享

    推荐使用实现runnable接口方式创建线程

    创建线程有哪两种方式
    继承Thread类
    实现runnable接口
    启动线程
    start();方法
    线程对象调用start()方法和调用run()方法的区别
    run()只有主线程一条执行路径
    start();多余执行路径,主程序和子程序并行交替执行

    run方法是给编译器用的 程序员用start方法
    推荐使用接口方式,我们知道java支持单继承 类的方式就失去了唯一一次继承的机会

    线程调度指按照特定机制为多个线程分配CPU的使用权

    死锁-----两个线程都在等待对方先完成,造成程序停滞2

    死锁的条件
    两个或者两个以上的线程在活动
    某个线程拿到一个锁以后,还想拿到第二个锁,造成锁的嵌套

     
    方法                            说明
    stePriority(int newPriority)               更改线程的优先级
    static void sleep(long millis)                   在指定的毫秒内让当前正在执行的线程休眠
    void join()                        等待该线程终止
    static void yield()                  暂停当前正在执行的线程对象,并执行其他线程
    void interrupt()                    终端线程
    Boolean isAlive()                   测试线程是否处于活动状态

    线程的优先级
    线程的优先级由1--10表示,1最低,默认优先级为5
    优先级高的线程获得CPU资源的概率较大

    让线程暂时睡眠指定时长,线程进入阻塞状态
    睡眠时间过长会再进入可运行状态
    public static void sleep(long millis)
    millis为休眠时长,以毫秒为单位
    调用slee()方法需要处理interruptedException异常

    使当前线程暂停,等待其他线程结束后再继续执行本线程

    public final void join();

    public final void join(long mills);

    public final void join(long mills,int nanos);

    millis以毫秒为单位的等待时长
    nanos 要等待的附加纳秒时长
    需要处理interruptedException异常`1343


    暂停当前线程,允许其他具有相同优先等级的线程获得运行机会
    该线程处于就绪状态,不转为阻塞状态
    public static void yield();

    只是提供一种可能,但不能保证一定会实现礼让

    线程的五个状态: 创建 就绪 阻塞 运行 死亡

    线程调度的方法:

    setPriority(int grade)
    sleep(long millis)
    Join()
    yield()

    当多个线程共享同一个资源时一个线程未完成全部操作的时候,其他线程修改数据,造成数据不安全的问题

    使用synchronized 修饰的方法控制对类成员变量的访问

    访问修饰符 synchronized 返回类型方法名(参数列表){

    }
    或者
    synchronized 访问修饰符 返回类型方法名(参数列表){

    }
    synchronized 就是为当前的线程声明一个锁


    ArrayList类的add()方法为非同步方法
    当多个线程向同一个ArrayList对象添加数据时,可能出现数据不一致问题

     1 package bdqn3;
     2 
     3 /**
     4  * hehe
     5  */
     6 public class Site extends Thread {
     7     public int count = 10;
     8     public int sum = 0;
     9 
    10     public void run() {
    11         while (true) {
    12             if (site() == false) {
    13                 break;
    14             }
    15 
    16         }
    17 
    18     }
    19 
    20     public synchronized boolean site() {
    21         if (count <= 0) {
    22             return false;
    23         }
    24         try {
    25             Thread.sleep(1000);
    26         } catch (InterruptedException e) {
    27 
    28         }
    29         count--;
    30         sum++;
    31         System.out.println("当前线程" + Thread.currentThread().getName() + "当前票是"
    32                 + sum + "剩余" + count);
    33         return true;
    34     }
    35 }
     1 package bdqn3;
     2 
     3 /**
     4  * hehe
     5  */
     6 public class MyMian {
     7     public static void main(String[] args) {
     8         Site site = new Site();
     9         Thread one = new Thread(site);
    10         Thread two = new Thread(site);
    11         Thread there = new Thread(site);
    12         System.out.println("开始抢票");
    13         one.start();
    14         two.start();
    15         there.start();
    16         one.start();
    17     }
    18 }
  • 相关阅读:
    常见DOS命令总结
    常见DOS命令总结
    HDU 6119 小小粉丝度度熊【线段合并+尺取法】(2017"百度之星"程序设计大赛
    HDU 6119 小小粉丝度度熊【线段合并+尺取法】(2017"百度之星"程序设计大赛
    【数论】——逆元
    【数论】——逆元
    需要了解的几个Java基础点
    TreeMap读源码总结
    Reactor模式
    Maven常见问题总结
  • 原文地址:https://www.cnblogs.com/wh1520577322/p/8558913.html
Copyright © 2011-2022 走看看