zoukankan      html  css  js  c++  java
  • Java之线程初步

    定义线程

    1、扩展java.lang.Thread类,实现run()方法,直接调用start()方法。

    2、实现java.lang.Runnable接口,然后传递给Thread对象,调用start()方法。

    线程模型

      每个线程有一个自己的栈。

    线程的状态

    1、线程睡眠是帮助所有线程获得运行机会的最好方法。sleep()是静态方法,只能控制当前正在运行的线程。

    2、线程的让步是通过Thread.yield()来实现的。线程优先级为1~10之间的正整数。

      线程默认优先级是5,Thread类中有三个常量,定义线程优先级范围:
      static int MAX_PRIORITY 
                线程可以具有的最高优先级。 
      static int MIN_PRIORITY 
                线程可以具有的最低优先级。 
      static int NORM_PRIORITY 
                分配给线程的默认优先级。
    实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。(和Windows API Sleep一样)

    线程同步

    1、join()方法。  

      保证当前线程停止执行,直到该线程所加入的线程完成为止。join()方法可以设置超时时间间隔。

    2、对象锁。

      Java中每个对象都有一个内置锁。当程序运行到非静态的synchronized同步方法上时,自动获得与正在执行代码类的当前实例(this实例)有关的锁。获得一个对象的锁也称为获取锁、锁定对象、在对象上锁定或在对象上同步。

      一个对象只有一个锁。所以,如果一个线程获得该锁,就没有其他线程可以获得锁。(这点相当别扭)

      只能同步方法,而不能同步变量和类。(极其恶心)

      在使用同步代码块时候,应该指定在哪个对象上同步,也就是说要获取哪个对象的锁。例如:

      

      可以同步静态方法。

      静态同步方法和非静态同步方法将永远不会彼此阻塞,因为静态方法锁定在Class对象上,非静态方法锁定在该类的对象上。

  • 相关阅读:
    Python unittest单元测试框架总结
    RabbitMQ集群搭建
    mysql之mysqldump——备份与还原
    新版本Ubuntu本地提权漏洞复现
    Flash 零日漏洞复现(CVE-2018-4878)
    申论之道
    上海失业金
    C# GUID有什么用?
    C#通过接口或者父类可以调用子类的方法或者属性吗?
    C# 按逗号分隔字符串&强制类型转换string转double
  • 原文地址:https://www.cnblogs.com/tekkaman/p/2065127.html
Copyright © 2011-2022 走看看