多线程实现的三种方式

一、继承实现多线程

小兔子示例

Rabit.java

package cn.thread;
/*
 * 模拟龟兔赛跑
 * 1.创建多线程 继承Thread   +重run(线程体)
 */
public class Rabit extends Thread {

    @Override
    public void run() {
        for(int i=0;i<100;i++) {
            System.out.println("兔子跑了"+i+"步");
        }
    }
    
}
class Tortoise extends Thread {

    @Override
    public void run() {
        for(int i=0;i<100;i++) {
            System.out.println("乌龟跑了"+i+"步");
        }
    }
    
}

RabitApp.java

package cn.thread;

public class RabitApp {
    public static void main(String[] args) {
        //1.创建子类对象
        Rabit rab=new Rabit();
        Tortoise tor=new Tortoise();
        //2.调用start()方法
        rab.start();
        tor.start();
        
        
        for(int i=0;i<1000;i++) {
            System.out.println("main--"+i);
        }
        
    }
}

效果

二、静态代理实现多线程

 与继承方式比较:

 

   1.静态代理(StaticProxy)

StaticProxy.java

package cn.thread;
/*
 * 静态代理 设计模式
 * 1、真实角色
 * 2、代理角色    持有真实角色的引用
 * 3、二者实现相同的接口
 */
public class StaticProxy {
    public static void main(String[] args) {
        //创建真实角色
        you y=new you();
        //创建代理角色
        WeddingCompany Company=new WeddingCompany(y);
        Company.marry();
    }
}
//接口
interface Marry{
    public abstract void marry();
}
//真实角色
class you implements Marry{

    @Override
    public void marry() {
        System.out.println("结婚了");
        
    }
    
}
//代理角色
class WeddingCompany implements Marry{
    private Marry you;
    
    public WeddingCompany() {

    }

    public WeddingCompany(Marry you) {
        this.you = you;
    }
    private void before() {
        System.out.println("布置猪窝。。。");
    }
    private void after() {
        System.out.println("收拾猪窝.。。。");
    }
    @Override
    public void marry() {
        before();
        you.marry();
        after();
        
    }
    
}

效果:

 三、Runnable接口 实现多线程

 推荐 Runnable 创建线程
  1)、避免单继承的局限性
  2)、便于共享资源
  使用Runnable 创建线程
  1.类 实现Runnable接口 +重写run()  ---》真实角色类
  2.启动多线程 使用静态代理
      1)、创建真实角色
      2)、创建代理角色+真实角色引用
      3)、调用 start() 启动线程
 

Programmer.java

package cn.thread;
/*
 * 推荐 Runnable 创建线程
 * 1)、避免单继承的局限性
 * 2)、便于共享资源
 * 使用Runnable 创建线程
 * 1.类 实现Runnable接口 +重写run()  ---》真实角色类
 * 2.启动多线程 使用静态代理
 *     1)、创建真实角色
 *     2)、创建代理角色+真实角色引用
 *     3)、调用 start() 启动线程
 */
public class Programmer implements Runnable {

    @Override
    public void run() {
        for(int i=0;i<100;i++) {
            System.out.println("一边玩儿");
        }
        
    }

}

ProgrammerApp.java

package cn.thread;

public class ProgrammerApp {
    public static void main(String[] args) {
        //1)、创建真实角色
        Programmer pro =new Programmer();
        //2)、创建代理角色+真实角色引用
        Thread proxy=new Thread(pro);
        //3)、调用 start() 启动线程
        proxy.start();
        for(int i=0;i<100;i++) {
            System.out.println("一边学");
        }
    }
}

效果:

四、抢票小示例

Web12306.java

package cn.thread;
/*
 * 方便共享资源
 */
public class Web12306 implements Runnable {
    private int num=50;
    @Override
    public void run() {
        while(true) {
            if(num<=0) {
                break; //跳出循环
            }
            System.out.println(Thread.currentThread().getName()+"抢着票了"+num--);
        }
        
    }
    public static void main(String[] args) {
        //真实角色
        Web12306 web=new Web12306();
        //
        Thread th1=new Thread(web,"甲");
        Thread th2=new Thread(web,"乙");
        Thread th3=new Thread(web,"丙");
        th1.start();
        th2.start();
        th3.start();
    }
    
}

效果展示:

 

小结:

一、继承Thread +run()

启动:创建子类对象 + 对象.start()

二、实现Runnable +run()

启动:使用静态代理

  1、创建真实角色

  2、创建代理角色 Thread+引用

  3、代理角色.start()

推荐使用接口:

  1、避免单继承局限性

  2、便于共享资源

 

posted on 2019-07-24 18:48  Mentality  阅读(444)  评论(0编辑  收藏  举报