首页 > 代码库 > 多线程的细节

多线程的细节

-------------------------------------

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异常,要做出处理方式

  

 

多线程的细节