zoukankan      html  css  js  c++  java
  • 【Java面试题】23 java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?

    java5 以前, 有如下两种:
    第一种:
    new Thread(){}.start();这表示调用 Thread 子类对象的 run 方法, new Thread(){}表示一个Thread 的匿名子类的实例对象, 子类加上 run 方法后的代码如下:

    new Thread(){
          public void run(){
         } 
     }.start();

    第二种:
    new Thread(new Runnable(){}).start();这表示调用 Thread 对象接受的 Runnable 对象的 run方法, new Runnable(){}表示一个 Runnable 的匿名子类的实例对象,runnable 的子类加上 run 方法后的代码如下:

     new Thread(new Runnable(){
             public void run(){
             } 
         }
      ).start();   

    从 java5 开始, 还有如下一些线程池创建多线程的方式:

    ExecutorService pool = Executors.newFixedThreadPool(3)
      for(int i=0;i<10;i++){
         pool.execute(new Runable(){
             public void run(){
             }
         });
     }
     Executors.newCachedThreadPool().execute(new Runable(){
         public void run(){
         }
     });
     Executors.newSingleThreadExecutor().execute(new Runable(
         {public void run(){
         }
     });   

     

    有两种实现方法, 分别使用 new Thread()和 new Thread(runnable)形式, 第一种直接调用
    thread 的 run 方法, 所以, 我们往往使用 Thread 子类, 即 new SubThread()。 第二种调
    用 runnable 的 run 方法。
    有两种实现方法, 分别是继承 Thread 类与实现 Runnable 接口
    用 synchronized 关键字修饰同步方法


    为何stop()和suspend()方法不推荐使用???

     stop()方法作为一种粗暴的线程终止行为,在线程终止之前没有对其做任何的清除操作,因此具有固有的不安全性。 用Thread.stop()方法来终止线程将会释放该线程对象已经锁定的所有监视器。如果以前受这些监视器保护的任何对象都处于不连贯状态,那么损坏的对象对其他线程可见,这有可能导致不安全的操作。 由于上述原因,因此不应该使用stop()方法,而应该在自己的Thread类中置入一个标志,用于控制目标线程是活动还是停止。如果该标志指示它要停止运行,可使其结束run()方法。如果目标线程等待很长时间,则应使用interrupt()方法来中断该等待。
             suspend()方法 该方法已经遭到反对,因为它具有固有的死锁倾向。调用suspend()方法的时候,目标线程会停下来。如果目标线程挂起时在保护关键系统资源的监视器上保持有锁,则在目标线程重新开始以前,其他线程都不能访问该资源。除非被挂起的线程恢复运行。对任何其他线程来说,如果想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。由于上述原因,因此不应该使用suspend()方法,而应在自己的thread类中置入一个标志,用于控制线程是活动还是挂起。如果标志指出线程应该挂起,那么用wait()方法命令其进入等待状态。如果标志指出线程应当恢复,那么用notify()方法重新启动线程。

  • 相关阅读:
    什么是 bean 的自动装配?
    什么是 Spring 的内部 bean?
    什么是 Spring 的 MVC 框架?
    Spring AOP and AspectJ AOP 有什么区别?
    解释 JDBC 抽象和 DAO 模块?
    volatile 类型变量提供什么保证?
    一个 Spring Bean 定义 包含什么?
    什么是 Spring MVC 框架的控制器?
    使用 Spring 访问 Hibernate 的方法有哪些?
    什么是 Callable 和 Future?
  • 原文地址:https://www.cnblogs.com/guweiwei/p/6612223.html
Copyright © 2011-2022 走看看