每一个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()方法会放弃锁