start()和run()的区别
start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法。start()不能被重复调用。
run() : run()就和普通的成员方法一样,可以被重复调用。单独调用run()的话,会在当前线程中执行run(),而并不会启动新线程!
通过下面的代码就可以验证上面的结论:
static class MyThread extends Thread {
@Override
public void run() {
super.run();
System.out.println("Thread is running on :"+Thread.currentThread().getName());
}
}
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.run();
myThread.start();
}
打印结果:
Thread is running on :main
Thread is running on :Thread-0
sleep
sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”。sleep()会指定休眠时间,线程休眠的时间会大于/等于该休眠时间;在线程重新被唤醒时,它会由“阻塞状态”变成“就绪状态”,从而等待cpu的调度执行。
重点是它不会释放线程锁,通过代码验证一下:
public static Object object = new Object();
static class MyThread extends Thread{
@Override
public void run() {
super.run();
synchronized (object) {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()+"=="+i);
if (i==4) {
try {
sleep(2*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
public static void main(String[] args) {
Thread thread = new MyThread();
Thread thread2 = new MyThread();
thread.start();
thread2.start();
}
打印结果:
Thread-0==0
Thread-0==1
Thread-0==2
Thread-0==3
Thread-0==4
Thread-1==0
Thread-1==1
Thread-1==2
Thread-1==3
Thread-1==4
分析上面的代码,两个线程共同持有object对象锁,当thread线程打印到4时休眠两秒钟,但是这个时候它并没有释放object的对象锁,所以thread2 也并没有得到执行。
wait、notiy、notiyall
释放线程锁,必须使用在synchronized 代码块中
sleep 和wait的比较
1.wait()的作用是让当前线程由“运行状态”进入“等待(阻塞)状态”的同时,也会释放同步锁。而sleep()的作用是也是让当前线程由“运行状态”进入到“休眠(阻塞)状态”。
但是,wait()会释放对象的同步锁,而sleep()则不会释放锁。
2.wait是Object类的方法而sleep是Thread类的方法。
950

被折叠的 条评论
为什么被折叠?



