每一个java程序包含一个主线程:main方法

创建线程的三种方式:

1、用一个子类继承 Thread类,重写run()方法,创建子类对象,用对象调用start()方法来启动线程。

2、用一个子类实现   Runnable  接口, 重写run()方法,创建子类对象,用执行器执行线程,(或包装到Thread对象中,调用start方法启动)

3、通过Callable 和Future 创建线程: 创建实现了Callable接口的 子类,并实现call()方法,该方法作为线程的线程体,并且带有返回值。 使用FutureTask 类包装 该子类的对象,该FutureTask 对象封装了该 Callable 对象 的call()方法的返回值。 使用FutureTask 对象作为  Thread的参数  来启动线程。(调用FutureTask对象的get()方法可获得子线程执行结束后的返回值)

 

Thread类的常用方法:  void start():  启动线程,执行对象的run方法

                                       run()  :线程的 执行体

                                       String  getName():   返回线程名

                                      void   setName(String  name): 设置线程名

                                      static currentThread():  返回当前线程

 

线程调度的方法:   同优先级线程采用   时间片策略,   不同优先级的线程采用 抢占式策略

 

线程优先级控制:  MAX_PRIORITY   (10)  ,  MIN_PRIORITY  (1)   ,  NORM_PRIORITY  (0)

    (线程被创建时默认优先级为 5)

getPriority() :  返回该线程的优先级         setPriority(int  n) 设置线程优先级

 

static  void  yield():线程让步     暂停当前正在执行的线程,把CPU让给同等或更高优先级的线程 (进入就绪状态)

join(): 在线程A中 调用 B线程的join方法,则A线程将被阻塞,直到B线程运行完成或B被阻塞

static void sleep(long millis):使该线程放弃CPU,(进入阻塞),时间到后进入就绪队列队尾

boolean  isAlive():判断线程是否还活着

 

线程可分为守护线程和用户线程: 守护线程使用来服务用户线程的,java垃圾回收就是一个守护线程,若JVM中都是守护线程,当前JVM将退出。

 setDaemon(true) :将一个线程变为守护线程

 

线程的5中状态: 新建、就绪、运行、阻塞、死亡

 

线程同步:(锁)  synchronized(对象){    需要被同步的代码 }

                   public   synchronized void  foo(){ ............}

释放锁的操作:1、当前线程的同步代码、同步方法执行结束

                          2、当前线程在同步代码块、同步方法中遇到了return、break

                          3、当前线程在同步代码块、同步方法中出现了Error或Exception

                          4、当前线程在同步代码块、同步方法中调用了wait()方法

线程通信:(java.lang.Object)wait()、notify()、notifyAll()只能在synchronized中使用,否则,产生异常

(wait()后,被notify或notifyAll唤醒都是从断点继续执行)

wait()、yeild()、sleep()都会放弃CPU、但只有 wait()方法会放弃锁