一 Thread
1. 导致线程阻塞:
- 调用sleep(毫秒数),使线程进入“sleep"状态。在规定的时间内,这个线程是不会运行的。
- 调用suspend() 暂停了线程的执行。除非线程收到resume()消息,否则 不会返回”可运行“状态。
- 调用wait() 暂停了线程的执行。除非线程收到nofify()或者notifyAll()消息,否则不会变成“可运行”。
- 线程正在等候一些IO(输入输出)操作完成。
- 线程试图调用另一个对象的“同步”方法,但那个对象处于锁定状态,暂时无法使用。
2. sleep和wait有什么区别?
- sleep()方法:属于Thread类,导致此线程暂停执行指定时间,将执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复(线程回到就绪(ready)状态),因为调用sleep 不会释放对象锁。
- wait()方法:则是属于Object类,对此对象调用wait()方法导致本线程放弃对象锁(线程暂停执行),进入等待此对象的等待锁定池,只有针对此对象发出notify 方法(或notifyAll)后,本线程才进入对象锁定池准备获得对象锁进入就绪状态。
3. 启动一个线程是用run()还是start()?
start()方法:启动一个线程,使线程就绪状态,以后可以被调度为运行状态
class MyThread extends Thread{
private String name;
public MyThread(String name){
super();
this.name=name;
}
public void run(){
for(int i=0;i<10;i++){
System.out.println("线程开始:"+this.name+".i="+i);
}
}
}
public class ThreadDemo2{
public static void main(String[] args){
MyThread mt1= new MyThread("线程a");
MyThread mt2=new MyThread("线程b");
mt1.start();
mt2.start();
}
}
run()方法:是该线程所关联的具体执行代码
class MyThread extends Thread{
private String name;
public MyThread(String name){
super();
this.name=name;
}
public void run(){
for(int i=0;i<10;i++){
System.out.println("线程开始:"+this.name+".i="+i);
}
}
}
public class ThreadDemo1{
public static void main(String[] args){
MyThread mt1= new MyThread("线程a");
MyThread mt2=new MyThread("线程b");
mt1.run();
mt2.run();
}}