美文网首页
创建线程的两种方式及静态代理

创建线程的两种方式及静态代理

作者: 是一动不动的friend | 来源:发表于2017-10-24 20:04 被阅读43次

创建线程有两种方式一种是继承Thread类另一种是继承Runnable接口实现静态代理。

1.继承Thread方式:

public class MyThread extends Thread {
    @Override
    public void run(){
        super.run();
        System.out.println("MyThread");
    }
}
public class Run {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
        System.out.println("运行结束");
    }
}

1)创建一个类继承Thread类,
2)改写run()方法,
3)再对象.start()。

2.静态代理方法实现(实现Runnable接口):由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。

1)首先静态代理包含了两个角色:代理角色和真实(委托)角色,
2)上述两个角色必需实现同一个接口,
3)代理角色要持有真实角色的引用,代理角色中要有方法供代理角色中的的真实角色指向之后生成的实例对象。代理角色里还有一些方法是委托方法
4)创建一个真实对象和一个代理对象,将真实对象赋给代理对象进行操作,但是操作的还是真实对象自己。

推荐使用实现Runnable接口:避免单继承,方便共享资源。

1>代理接口

/**  
 * 代理接口。处理给定名字的任务。 
 */  
public interface Subject {  
  /** 
   * 执行给定名字的任务。 
    * @param taskName 任务名 
   */  
   public void dealTask(String taskName);   
}  

2>委托类,具体处理业务。

/** 
 * 真正执行任务的类,实现了代理接口。 
 */  
public class RealSubject implements Subject {  
  
 /** 
  * 执行给定名字的任务。这里打印出任务名,并休眠500ms模拟任务执行了很长时间 
  * @param taskName  
  */  
   @Override  
   public void dealTask(String taskName) {  
      System.out.println("正在执行任务:"+taskName);  
      try {  
         Thread.sleep(500);  
      } catch (InterruptedException e) {  
         e.printStackTrace();  
      }  
   }  
}  

3>静态代理类

/** 
 * 代理类,实现了代理接口。 
 */  
public class ProxySubject implements Subject {  
 //代理类持有一个委托类的对象引用  
 private Subject delegate;  
   
 public ProxySubject(Subject delegate) {  
  this.delegate = delegate;  
 }  
  
 /** 
  * 将请求分派给委托类执行,记录任务执行前后的时间,时间差即为任务的处理时间 
  *  
  * @param taskName 
  */  
 @Override  
 public void dealTask(String taskName) {  
  long stime = System.currentTimeMillis();   
  //将请求分派给委托类处理  
  delegate.dealTask(taskName);  
  long ftime = System.currentTimeMillis();   
  System.out.println("执行任务耗时"+(ftime - stime)+"毫秒");    
 }  
}  

4>生成静态代理类工厂

public class SubjectStaticFactory {  
 //客户类调用此工厂方法获得代理对象。  
 //对客户类来说,其并不知道返回的是代理类对象还是委托类对象。  
 public static Subject getInstance(){   
  return new ProxySubject(new RealSubject());  
 }  
}  

5>客户类

public class Client1 {  
 public static void main(String[] args) {  
  Subject proxy = SubjectStaticFactory.getInstance();  
  proxy.dealTask("DBQueryTask");  
 }   
}  

3.通过过实现Runnable接口实现静态代理从而开启多线程:

把Thread当成代理类创建main和thread两个线程

public class Run {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        Thread thread = new Thread(myThread);
        thread.start();
        for (int i =0;i<10000;i++){
            System.out.println(i);
        }
    }
}

委托类实现接口

public class MyThread implements Runnable{
    public void run() {
        for (int i = 0;i<10000;i++){
            System.out.println("rua");
        }
    }
}

相关文章

  • 创建线程的两种方式及静态代理

    创建线程有两种方式一种是继承Thread类另一种是继承Runnable接口实现静态代理。 1.继承Thread方式...

  • 2019-03-19 Fragment详解

    Fragment两种创建方式 fragment的创建方式有两种,所谓的静态创建就是通过XML的方式来创建,动态创建...

  • 静态代理、JDK动态代理、CGLIB动态代理

    静态代理 静态代理是代理模式的实现方式之一,是相对于动态代理而言的。所谓静态代理是指,在程序运行前,由程序员创建或...

  • 【java基础】线程

    java基础 线程 参考详细:Java之多线程 一、创建线程 创建线程常见有两种方式,另外有两种新增方式 1.Th...

  • 多线程 -- threading

    多线程模块 threading 创建多线程的两种方式:import threadingimport time 创建...

  • Java的两种多线程实现方式

    一、创建多线程的两种方式 Java中,有两种方式可以创建多线程: 1 通过继承Thread类,重写Thread的...

  • 静态代理

    静态代理, : //创建代理 总结静态代理: 解决: 可以使用动态代理。

  • 206集多线程 Java300

    多线程一切从run开始,main也是一个线程 直接创建子类对象 208课静态代理模式 真实角色 代理角色 二者...

  • Spring AOP中的动态代理

    Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理: (3)静态代理与动态代理区别...

  • 案例深入分析多线程的两种实现方式

    一、创建多线程的两种方式 Java中,有两种方式可以创建多线程: 1 通过继承Thread类,重写Thread的r...

网友评论

      本文标题:创建线程的两种方式及静态代理

      本文链接:https://www.haomeiwen.com/subject/coyxpxtx.html