1. 几个小问题
1)一个线程对象,可以多次调用start()方法吗?
不能,否则会有java.lang.IllegalThreadStateException异常
指示线程没有处于请求操作所要求的状态时抛出的异常
2)多个线程是共享一个run()方法,还是每个线程对象执行的时候都走自己的run()方法
每个线程对象有自己的run()方法执行,run里面封装的是被多线程操作的代码
所以,每个线程拥有自己的一个run()方法,但是,多个线程可以共同处理同一个资源
2. 死锁问题:多个线程使用多把锁,相互等待
3. JDK5以后的新同步操作--有一个Lock接口和一个实现了Lock接口的ReentrantLock类
可以明确什么时候加锁,什么时候解锁
class X{
private final ReentrantLock lock = new ReentrantLock();
public void m(){
lock.lock();
try{}
finally{
lock.unlock()
}
}
}
4. 线程间的通信--不同种类的线程
1)如何保证多个对象操作的是同一个资源?
我们在测试类中创建了学生对象,然后把学生对象作为构造参数传递到不同的线程操作类中
2)如果是种类不同的线程,请保证这多个线程的锁必须是同一把
5. 唤醒机制--wait() + notify()组合
Object类 有 wait()和notify()方法
wait()方法的特点:
哪里等待,从哪里释放锁。将来醒过来的时候,是从上次等待的地方醒过来的
一个面试题:sleep()和wait()的区别?
1)sleep()表示睡眠,必须指定时间;不释放锁
2)wait()表示等待,可以指定时间,也可以不指定时间;释放锁
6. Thread类下每个线程都有一个优先级
public final void setPriority(int newPriority)
public final int getPriority()
线程默认优先级是5 MAX_PRIORITY--10 MIN_PRIORITY--1
线程的优先级一般情况下效果不大
在次数特别多的情况下,线程优先级高的对象可能比线程优先级低的先获取到优先权
7. 暂停线程
public static void yield() --暂停正在执行的线程对象,并执行其他线程
暂停线程可以在一定程度上,让线程间运行的可以和谐一些
如果想保证数据和谐,请采用等待唤醒机制
8. public final void join()
其他线程必须等待加入线程执行完毕后才能执行
注意:加入线程是必须在线程start()后的动作
9. 守护线程:
主线程结束了,那么所有守护线程就都立刻结束
10. 最简单的线程程序代码
new Thread(){
public void run(){
//code...
}
}.start();
new Thread(new Runnable(){
public void run(){
//code...
}
}).start();