zoukankan      html  css  js  c++  java
  • 创建线程的两种方式比较Thread VS Runnable

    1.首先来说说创建线程的两种方式

    一种方式是继承Thread类,并重写run()方法

     1 public class MyThread extends Thread{
     2     @Override
     3     public void run() {
     4         // TODO Auto-generated method stub
     5         
     6     }
     7 }
     8 //线程使用
     9 MyThread mt = new MyThread();  //创建线程
    10 mt.start();                   //启动线程

    另外一种方式是实现Runnable接口

     1 public class MyThread implements Runnable{
     2     @Override
     3     public void run() {
     4         // TODO Auto-generated method stub
     5         
     6     }
     7 }
     8 //线程使用
     9 MyThread mt = new MyThread();
    10 Thread thread = new Thread(mt);//创建线程
    11 thread.start();                   //启动线程

    2.两种方式创建线程比较

    第一点:通过创建线程方式可以看出,一个是继承一个是实现接口,但是Java是只能继承一个父类,可以实现多个接口的一个特性,所以说采用Runnable方式可以避免Thread方式由于Java单继承带来的缺陷。

    第二点:Runnable的代码可以被多个线程共享(Thread实例),适合于多个多个线程处理统一资源的情况。

      举例说明:模拟卖票,假设还剩5张票,分别采用两种方式来创建线程模拟

      TicketThread.java //采用继承方式模拟3个窗口卖5张票的情况

     1 public class TicketThread {
     2     public static void main(String[] args) {
     3         //创建了3个线程,模拟三个窗口卖票
     4         MyThread mt1 = new MyThread("线程一");
     5         MyThread mt2 = new MyThread("线程二");
     6         MyThread mt3 = new MyThread("线程三");
     7         
     8         //启动线程
     9         mt1.start();
    10         mt2.start();
    11         mt3.start();
    12     }
    13 
    14 }
    15 
    16 class MyThread extends Thread{
    17     private int num = 5;//模拟还剩余5张票
    18     private String name;//用来表示线程名称
    19     
    20     public MyThread(String name){
    21         this.name = name;
    22     }
    23     
    24     @Override
    25     public void run() {
    26         while(num > 0){
    27             num--;
    28             System.out.println(name+"卖出了一张票,剩余票数为"+num);
    29         }
    30     }
    31 }

     运行结果为:

     1 线程一卖出了一张票,剩余票数为4
     2 线程一卖出了一张票,剩余票数为3
     3 线程一卖出了一张票,剩余票数为2
     4 线程一卖出了一张票,剩余票数为1
     5 线程一卖出了一张票,剩余票数为0
     6 线程二卖出了一张票,剩余票数为4
     7 线程二卖出了一张票,剩余票数为3
     8 线程二卖出了一张票,剩余票数为2
     9 线程二卖出了一张票,剩余票数为1
    10 线程二卖出了一张票,剩余票数为0
    11 线程三卖出了一张票,剩余票数为4
    12 线程三卖出了一张票,剩余票数为3
    13 线程三卖出了一张票,剩余票数为2
    14 线程三卖出了一张票,剩余票数为1
    15 线程三卖出了一张票,剩余票数为0

       可以看出共卖出了15张票,变成了每个线程都有5张票了

      TicketRunnable.java //采用Runnable实现

     1 public class TickerRunnable{
     2     public static void main(String[] args) {
     3         MyThread mt = new MyThread();
     4         //同样创建3个线程
     5         Thread t1 = new Thread(mt, "线程一");
     6         Thread t2 = new Thread(mt, "线程二");
     7         Thread t3 = new Thread(mt, "线程三");
     8         //启动线程
     9         t1.start();
    10         t2.start();
    11         t3.start();
    12     }
    13 
    14 }
    15 
    16 class MyThread implements Runnable{
    17     private int num = 5;//模拟还剩余5张票
    18     
    19     @Override
    20     public void run() {
    21         while(num > 0){
    22             num--;
    23             System.out.println(Thread.currentThread().getName()+"卖出了一张票,剩余票数为"+num);
    24         }
    25     }
    26 }

       运行结果为:

    1 线程一卖出了一张票,剩余票数为4
    2 线程三卖出了一张票,剩余票数为3
    3 线程三卖出了一张票,剩余票数为1
    4 线程二卖出了一张票,剩余票数为0
    5 线程一卖出了一张票,剩余票数为2

     这样可以看出多个线程共享了Runnbale里面的5这个变量,至于结果为什么不是输出剩余票数4 3 2 1 0,这个是由于线程的调度问题造成的,每次运行都会看到不一样的结果。

  • 相关阅读:
    ffmpeg合并视频+音频
    You-Get和youtube-dl
    【会声会影】初装会声会影时,必要的设置
    【会声会影】视频导出、输出时,如何设置参数
    【会声会影】导入的srt字幕文件,如何快速批量调整字体及大小
    把h264文件快速包装成mp4格式
    Notepad++正则表达式——去掉srt字幕文件的时间轴
    百度地图API的网页使用
    ASPCMS_判断语句if标签的使用
    Grid布局
  • 原文地址:https://www.cnblogs.com/lylife/p/4756981.html
Copyright © 2011-2022 走看看