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

    1、sleep和wait方法的异同

      sleep和wait都可以让线程睡眠

      不同:

        sleep需要指定时间,而wait可以指定时间,也可以不用指定时间。

        sleep时间到了线程就会重新恢复到运行状态。wait如果没有指定时间,必须通过notify、notifyAll方法来唤醒

        sleep可以使用同步代码块中,也可以不使用同步代码块中,wait必须使用同步代码块中。

        sleep睡眠后不会释放锁,而wait会释放锁。

    2、停止线程和interrupt方法

      一般情况下线程要结束,都是通过run方法运行完成,线程就结束了。如果要线程提前中止运行,可以使用stop方法。但是stop方法过时了,原因有不安全因素。stop方法中给出了相应的解决方案:在线程中可以定义一些变量或者标记,然后在线程运行的期间,判断这个变量或者标记,最终让线程执行的仍然运行完成。如果线程长时间处于等待(冻结)状态可以使用interrupt方法来中断这种等待。

      interrupt()  其实是把线程这种等待状态给清除,让线程重新恢复到运行状态。

     1 //测试线程停止和中断等待
     2 
     3 class Demo implements Runnable
     4 {
     5     boolean flag = false;
     6     public void run()
     7     {
     8         while( true )
     9         {
    10             synchronized( this )
    11             {
    12                 System.out.println(Thread.currentThread().getName()+"......"+flag);
    13 
    14                 try{ this.wait(); }catch(Exception e){}
    15                 
    16                 if(flag)
    17                 {
    18                     break;
    19                 }
    20             }
    21         }
    22     
    23     }
    24 }
    25 class ThreadDemo 
    26 {
    27     public static void main(String[] args) 
    28     {
    29         Demo d = new Demo();
    30 
    31         Thread t = new Thread(d);
    32         Thread t2 = new Thread(d);
    33 
    34         t.start();
    35         t2.start();
    36 
    37 
    38         for( int i=0;i<100;i++ )
    39         {
    40             System.out.println(Thread.currentThread().getName()+"========"+i);
    41             if( i==50 )
    42             {
    43                 d.flag = true;
    44                 //清除Thread-0的等待状态
    45                 t.interrupt();
    46                 t2.interrupt();
    47             }
    48         }
    49     }
    50 }

    3、守护线程、线程组、线程优先级

      守护线程:后台线程。当我们直接创建的线程,没有设置它的任何属性时,这个线程一般都属于非守护线程(前台线程)。

      非守护线程,它和主线程一起执行,当主线程执行完成之后,如果还有其他非守护线程没有执行结束,当前程序依然在正常的运行。

      守护线程:它也是用来执行线程任务的,它会随着非守护线程一起执行。当程序中没有任何一个非守护线程在运行时,这时不管有多少个守护线程,它们及时没有执行完成,程序也会自动停止运行。守护线程就自动结束运行了。

      线程组:把完成类似功能的线程可以合并在一起,使用一个组来管理当前这些线程,即可以通过组的方式来管理线程。

      线程优先级:线程优先级采用数字来标识,从1开始到10,一般情况下会使用1   5   10  来标记当前的线程的优先级

    优先级高的线程执行的次数会比优先级低的线程多。优先级高,只能让cpu执行到这个线程的几率变高,而不是说cpu就一直在执行它。

    getPriority()   获取当前线程的优先级

    setPriority(int newPriority)  设置线程的优先级,newPriority参数可以是1-10!建议设置的时候1  5  10 这三个数字。

      守护线程源码:

     1 //测试线程停止和中断等待
     2 
     3 class Demo implements Runnable
     4 {
     5     boolean flag = false;
     6     public void run()
     7     {
     8         int num = 1;
     9         while( num<20 )
    10         {
    11             System.out.println(Thread.currentThread().getName()+"......"+num++);
    12         }
    13     }
    14 }
    15 class ThreadDemo2 
    16 {
    17     public static void main(String[] args) throws InterruptedException
    18     {
    19         Demo d = new Demo();
    20 
    21         Thread t = new Thread(d);
    22         Thread t2 = new Thread(d);
    23         t.setPriority(10);
    24         t2.setPriority(1); 
    25 
    26         //把2个线程都设置成守护线程
    27         t.setDaemon(true);
    28         t2.setDaemon(true);
    29         t.start();
    30         t2.start();
    31 
    32         for( int i=0;i<10;i++ )
    33         {
    34             System.out.println(Thread.currentThread().getName()+"========"+i);
    35             //让主线程临时停顿
    36             Thread.yield();
    37         }
    38 
    39         System.out.println("........................."+t);
    40     }
    41 }

    4、join和yield方法介绍

      join()  让某个线程强制加入到当前cpu的执行队列中。在使用join加入其他线程到运行状态中来时,这个加入的语句肯定是写在其他的线程的执行代码中。书写加入线程的代码所在的那个线程此时就会处理临时冻结状态,等待被加入的线程执行结束后,它就立刻恢复运行的状态。

      yield()  让当前正在执行的临时停顿一下,然后立刻就恢复运行状态。

     

     多线程需要掌握的技术:

      1、创建线程的2种方式  继承Thread和实现Runnable接口

      2、掌握线程的安全问题发生的原因和解决

      3、掌握单生产和单消费的原理以及等待唤醒机制

    5、面试题

      

      

  • 相关阅读:
    OCP-1Z0-053-200题-36题-615
    Android换行符变成方框的解决方法
    OCP-1Z0-053-200题-35题-614
    FusionCharts 3D帕累托图
    FusionCharts 3D帕累托图报错
    FusionCharts 2D帕累托图
    OCP-1Z0-053-200题-33题-612
    OCP-1Z0-053-V13.02-612题
    OCP-1Z0-053-200题-32题-611
    OCP-1Z0-053-V13.02-611题
  • 原文地址:https://www.cnblogs.com/cb0327/p/4986870.html
Copyright © 2011-2022 走看看