1、sleep()和wait()的异同点是什么?
相同点:都可以让线程处于等待状态;
不同点:
sleep必须指定时间;
wait可以指定时间,也可以不指定时间
sleep时间到,线程处于就绪或者运行状态;
wait如果没有时间,必须要通过notify或notifyAll唤醒。
sleep不一定非要定义在同步中。
wait必须定义在同步中。
若都定义在同步中时,
线程执行到sleep,不会释放锁;
线程执行到wait,会释放锁;
2、线程如何停止呢?
stop()方法已经过时了,通过查看API文档stop部分,发现提供了其他的解决方案;
线程结束:就是让线程的任务代码执行完毕,run()方法结束。
run()方法如何结束呢?
run方法中通常都定义循环,则需要控制住循环就行了,即通过定时检查标记,确定循环是否结束。
注意:万一线程在执行过程中处于了等待状态,那它将无法检查标记了。此时通过再次查阅API文档,发现有如下解决办法:如果目标线程等待了过长时间,则应调用interrupt()方法中断该线程;
所谓的中断并不是停止线程,interrupt的功能是:将线程的等待状态清除,让线程恢复到运行状态(即让线程重新具备CPU的执行资格)。因为interrupt是强制性的,所以会有异常发生,可以在catch中捕获异常,在异常处理中,改变标记让循环结束,从而结束该线程的run方法。package thread类测试.终止线程;
public class StopThreadDemo {
public static void main(String[] args) {
StopThread st = new StopThread();
Thread t1 = new Thread(st);
Thread t2 = new Thread(st);
t1.start();
t2.start();
int x = 0;
while(true) {
if(x++ == 50) {
t1.interrupt();
t2.interrupt();
break;
}
System.out.println(Thread.currentThread().getName()+"......"+x);
}
}
}
class StopThread implements Runnable {
private boolean flag = false;
@Override
public synchronized void run() {
while(!flag) {
try {
System.out.println(Thread.currentThread().getName()+" -----> wait()");
wait();
} catch (InterruptedException e) {
changeFlag(); //处理标记,控制线程结束
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"----->");
}
}
public void changeFlag() {
flag = true;
}
}
3、守护线程
守护线程也就是后台线程,一般创建的都是前台线程,可以调用Thread的静态方法setDaemon(true)将线程标记为后台线程。
前台、后台线程运行时都是一样的,获取CPU的执行权执行线程。
只有在结束时不一样,前台线程要通过run方法结束,线程结束;
后台线程也可以通过run方法结束,线程结束,但还有另外一种情况,当进程中所有的前台线程都结束了,这时无论后台线程处于什么样的状态,都会结束,从而进程结束。
进程结束以来的都是前台进程。
4、线程的优先级
用数字标识,范围为1~10,其中默认的初始优先级为5,可以调用setPriority()方法设置线程的优先级,如setPriority(Thread.MAX_PRIORITY);
5、线程组
ThreadGroup,可以通过Thread的构造函数明确新先线程对象所属的线程组。
线程组的好处:可以对多个同组线程,进行统一的操作。默认都属于main线程组。
6、join(),join(time),yield()
join方法:等待当前调用线程执行完毕;
join(time):等待当前调用线程执行time毫秒;
yield:线程暂时停止;
7、new Thread(new Runnable() {
@Override
public void run() {
System.out.println("runnable");
}
}) {
public void run() {
System.out.println("子类");
}
}.start();;
执行结果为: