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对象上,非静态方法锁定在该类的对象上。

原文地址:https://www.cnblogs.com/tekkaman/p/2065127.html