-------------------------------------
1,sleep,wait区别
相同点:可以让线程处于冻结状态。
不同点:
1,
sleep必须指定时间。
wait可以指定时间,也可以不指定时间。
2,
sleep时间到,线程处于临时阻塞或者运行。
wait如果没有时间,必须要通过notify或者notifyAll唤醒。
3,
sleep不一定非要定义在同步中。
wait必须定义在同步中。
4,
都定义在同步中,
线程执行到sleep,不会释放锁。
线程执行到wait,会释放锁.
总结:小朋友抓人,sleep会自己醒,而wait需要别人叫你.线程要有拿到锁和有执行权时才能运行,在第四点中wait和sleep都会释放执行权,
-------------------------------------
2,停止线程-定义标记
思想:通过标记控制循环就可以了,把标记加入条件语句中可以用while(flag),通过改变标记的状态.代码如下
//演示停止线程-定义标记。 class Demo implements Runnable { private boolean flag = true; public synchronized void run() { while(flag) { System.out.println(Thread.currentThread().getName()+"----->"); } } //对标记的修改方法。 public void changeFlag() { flag = false; } } class StopThreadDemo { public static void main(String[] args) { Demo d = new Demo(); Thread t1 = new Thread(d); Thread t2 = new Thread(d); t1.start(); t2.start(); int x = 0; while(true) { if(++x == 50)//条件满足。 { d.changeFlag();//改变标记,让其他线程停止 break;//调出循环,让主线程停止 } } } }
-------------------------------------
3,停止线程-interrupt方法
出现问题:如果线程处于冻结状态,就无法判断标记,就无法结束。
分析问题:这时就需要通过结束线程的冻结状态让其恢复到运行状态。
解决问题:可以通过Thread类中的interrupt方法解决这个问题.
注意:该方法会使线程出现InterruptedException异常,要做出处理方式。
//演示停止线程。 class Demo implements Runnable { private boolean flag = true; public synchronized void run() { while(flag) { try { wait();//t1 t2 } catch (InterruptedException e) { System.out.println(Thread.currentThread().toString()+"....."+e.toString()); changeFlag(); } System.out.println(Thread.currentThread().getName()+"----->"); } } //对标记的修改方法。 public void changeFlag() { flag = false; } } class StopThreadDemo { public static void main(String[] args) { Demo d = new Demo(); Thread t1 = new Thread(d); Thread t2 = new Thread(d); t1.start(); //将t2标记为后台线程,守护线程。 // t2.setDaemon(true); t2.start(); int x = 0; while(true) { if(++x == 50)//条件满足。 { // d.changeFlag();//改变线程任务代码的标记,让其他线程也结束。 //对t1线程对象进行中断状态的清除,强制让其恢复到运行状态。 t1.interrupt(); //对t2线程对象进行中断状态的清除,强制让其恢复到运行状态。 t2.interrupt(); break;//跳出循环,主线程可以结束。 } System.out.println("main-------->"+x); } System.out.println("over"); } }
-------------------------------------
4,其他方法-[守护线程]
a,守护线程:是后台线程.我们一般创建是前台线程,打个比喻,把前台线程比作是演员,后台线程比作是放音乐的,当演员结束了,后代线程也就自动结束了.(1)前台后台线程运行时过都是一样的,获得CPU的执行权,(2)他们都可以通过RUN方法结束.上面讲的演员放音乐是一个特殊的例子.
b,优先级(三个常量值,也可以设置其他的值1-10),线程组。
c,join方法:加入一个执行线程。
d,yield方法:暂停线程,释放执行权。
e,线程的匿名内部类。【面试题】
new Thread(new Runnable()
{
public void run()
{
System.out.println("runnable run");
}
}){
public void run()
{
System.out.println("subthread run");//执行。
}
}.start();