1、定义、实例化线程
两种方法:
1)、扩展java.lang.Thread
public class MyThread extends Thread{
public void run(){...}
/**
*可以在Thread子类中自由的重载run方法,但只有调用重载的run(String s)方法,否则没有人调用它,它
*不会被用作新调用栈的基础。
*/
public static void main(String[] args){
MyThread a = new MyThread();
a.start();
}
}
2)、设计Runnable接口
public class MyThread implements Runnable{
public void run(){...}
public static void main(String[] args){
MyThread a = new MyThread();
Thread t1 = new Thread(a); //Runnable 成为线程的目标
Thread t2 = new Thread(a); //多线程
Thread t3 = new Thread(a);
t1.start();
t2.start();
t3.start();
}
}
Thead 类的其他构造函数
Thread();
Thread(Runnable target);
Thread(Runnable target,String name);
Thread(String name);
Thread(ThreadGroup group,Runnable target);
Thread(ThreadGroup group,String name);
Thread(ThreadGroup group,Runnable target,String name);
通过Thread.CurrentThread()可以得到对当前执行线程的引用。
2)、Thread中的两个方法start和run
start():启动新线程,该线程从新状态到可运行状态,run方法。
run():可以被调用,也可以start()启用
一旦线程结束(run()结束)他就不能再被启动。若再调用start()产生运行时异常。
3)、线程调度程序:
//1. java.lang.Thread
public static void sleep(long mills) throws InterruptedException //重载
public static void yield();
public final void join(); //重载
public final setPriority(int newPriority);
//2.java.lang.Object
public final void wait();
public final void notify();
public final void notifyAll();
2、阻止线程执行
关心的问题:
1)、睡眠:在代码中使用它强制当前线程在回到可运行状态之前进入睡眠状态。
try-catch
无保障:当前线程醒来的时候,他只能回到可运行状态。
2)、等待
优先级:最高优先级抢占、同优先级时间片,或选一个运行完毕、阻塞、
无保障-----默认5级------min(1)------NORM(5)------max(10)
让步:让当前的运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。
无保障 回到可运行状态还会被选中。
join方法:t.join[mian()中]
保证离开线程:
sleep 保证
yield 无保证
join 保证
run 完成 保证离开
wait 保证
线程不能在对象上获得锁定,而试图运行该线程的方法
3)、因为需要一个对象的锁定而被等待。
3、同步代码
怎样保护数据:把变量标记为private,同步那些修改变量的方法
- 只能同步方法,不能同步变量
- 每个对象只有一个锁
- 类可有同步和非同步方法
- 一旦线程获得对象上的锁,则任何其他线程都不能进入该类的同步方法,但可访问非同步方法。
- 如果线程睡眠,则它带着锁。
- 线程可以获得多个锁,也可以调用统一对象上的多个同步方法。
- 同步方法和代码块时,要获得对象的锁。
- 死锁=程序死掉
4、线程交互
Object 中的wait(),notify(),notifyAll()
必须在同步环境内调用wait(),notify(),notifyAll()
线程不能调用对象上的等待或通知方法除非它拥有那个对象。
如果调用wait的方法不拥有该锁抛出非检查异常,b.wait()时将释放锁。
- wait(),notify(),notifyAll()属于 object
- start(),yield(),sleep()、join()属于Thread
- run() 属于 Runnable
如果没有中断,无论什么时候通知他或超过指定的时限时,都将继承。退出等待状态。
synchronized(a){
a.wait(2000);//thread release the lock and waits for notify
//but for 2 seconds,then goes bank to Runnable
//thread reacquires the lock
}