zoukankan      html  css  js  c++  java
  • 多线程的细节

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

    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();


    作者:8亩田
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.

    本文如对您有帮助,还请多帮 【推荐】 下此文。
    如果喜欢我的文章,请关注我的公众号
    如果有疑问,请下面留言

    学而不思则罔 思而不学则殆
  • 相关阅读:
    二分使用条件 + 代码模板
    Codeforces Round #710 (Div. 3) Editorial 1506A
    Cf #709 Div. 2 B. Restore Modulo 一个只有三千多人过的b题, 妙啊!
    牛客网 第十八届浙大城市学院程序设计竞赛(同步赛)J--万万没想到 啦啦啦啦啦
    Codeforces Round #707 (Div. 2)A.英语漏洞 + C.Going Home C题收获不小
    Codeforces Round #706 (Div. 2)B. Max and Mex __ 思维, 模拟
    Codeforces Round #705 (Div. 2) B. Planet Lapituletti(镜像时钟) 思维
    位运算
    Edu Cf Round 105 (Div. 2) B. Berland Crossword 1.读懂题, 2. 思维
    Codeforces Round #703 (Div. 2)__ B. Eastern Exhibition__ 纯纯的思维
  • 原文地址:https://www.cnblogs.com/liu-wang/p/6094512.html
Copyright © 2011-2022 走看看