zoukankan      html  css  js  c++  java
  • 多线程的实现方式及其区别

    实现多线程有两种方式:(自JDK1.5之后有三种,最后一种并不常用)

       1.继承Thread类

       2.实现Runnable接口(Callable接口)

    一个类如果实现了Runnable接口或者继承了Thread类,那么它就是一个多线程类,如果是要实现多线程,还需要重写run()方法,所以run() 方法是多线程的入口。

    但是在启动多线程的时候,不是从run()方法开始的,而是从start()开始的 理由是:当执行多线程的时候,每一个线程会抢占资源,而操作系统会为其分配资源,在start()方法中不仅执行了多线程的代码,除此还调用了一个start0()方法,该方法的声明是native,在Java语言中用一种技术叫做JNI,即JavaNativeInterface,该技术特点是使用Java调用本机操作系统提供的函数,但是有一个缺点是不能离开特定的操作系统,如果线程需要执行,必须有操作系统去分配资源,所以此操作主要是JVM根据不同的操作系统来实现的

    如果多线程是通过实现Runnable接口来实现的,那么与通过继承Thread来实现有一个区别,那就是多线程的启动方式——必须是通过start()来启动,但是Runnable接口只有一个方法,并没有start()方法,所以在启动多线程的时候必须调用Thread类的一个构造方法——Thread(Runnable target),该构造方法得到了Runnable接口的一个实现,于是就可以调用Thread类的start()方法了。

    多线程的两种实现方式的区别:

       1.Thread是Runnable接口的子类,实现Runnable接口的方式解决了Java单继承的局限

       2.Runnable接口实现多线程比继承Thread类更加能描述数据共享的概念

    注意:通过实现Runnable接口解决了Java单继承的局限,所以不管其他的区别联系是什么,这一点就决定了多线程最好是通过实现Runnable接口的方式

    关于数据共享的简单例子如下:

     public class Thread_1 implements Runnable {

     int ticket=10;

     @Override  public void run()

    {   

    for (int i = 0; i < 100; i++) {  

        if(ticket>0){  

         System.out.println(ticket--);

         }

      }  

    }  

    public static void main(String[] args) {

         /*Thread_1 thread_1=new Thread_1();  

          new Thread(thread_1).start();   

         new Thread(thread_1).start();  

         new Thread(thread_1).start();*/   

      MyThread myThread1=new MyThread();  

          MyThread myThread2=new MyThread();

          MyThread myThread3=new MyThread();   

          myThread1.start();

           myThread2.start();  

          myThread3.start();     

     }

    } class MyThread extends Thread{

     int ticket=10;

     @Override  public void run() {

      for (int i = 0; i < 100; i++) {

         if(ticket>0){    

                   System.out.println(ticket--);

         }   

      }   

      }

    }

     例子解析:

    当通过继承Thread类实现多线程的时候,每一个对象持有各自的10张ticket,而不是共用10张ticket,所以程序执行会重复三次,如果通过实现Runnable接口,则是三个对象共享10张ticket,实现了数据的共享。

  • 相关阅读:
    PAT Basic Level 1013
    PAT Basic Level 1012
    PAT Basic Level 1011
    PAT Basic Level 1009
    PAT Basic Level 1010
    PAT Basic Level 1008 *
    PAT Basic Level 1007 *
    .NET Entity Framework入门简介及简单操作
    SQL Server 查询处理中的各个阶段(SQL执行顺序)
    泛型优点和特性
  • 原文地址:https://www.cnblogs.com/Mindreader/p/5472409.html
Copyright © 2011-2022 走看看