zoukankan      html  css  js  c++  java
  • 线程的概念

    1.多线程的由来介绍
    随着计算机的飞速发展,个人计算机上的操作系统可以在同一时间内执行多个程序,于是引入了进程的概念。所谓进程就是一个动态执行的程序,当一个程序运行的时候,就创建了一个容纳组成代码和数据空间的进程。例如Windows XP上运行的每一个程序都是一个进程。而且每一个进程都有自己的一块内存空间和一组系统资源。它们之间都是相互独立的。进程概念的引入使得计算机操作系统同时处理多个任务成为了可能.
      跟进程相似,线程是比进程更小的单位。所谓线程,是指进程中单一顺序的执行流,线程可以共享内存单元和系统资源,但不能单独执行,而必须存在于某个进程当中。由于线程本身的数据通常只有微处理器的寄存器数据和一个供程序执行时使用的堆栈,因此线程也被称作轻负荷进程,一个进程中至少包括一个线程。
      以前开发的很多程序都是单线程的,即一个进程中只包含一个线程,也就是说一个程序只有一条执行路线。但在,现实中的很多过程都是可以按照多条路线来执行的,例如通常使用的浏览器,在浏览器中可以在下载图片的时候滚动页面来浏览不同的内容。这与多线程的概念是相似的,多线程其实就意味着一个程序可以按照不同的执行路线来共同工作。而多线程的定义是指在单个程序中可以同时运行多个不同的线程执行不同的任务,需要注意的是,计算机系统中多个线程是并发执行的,因此,任意时刻只能有一个线程在执行,但是由于CPU的速度非常快,给用户的感觉像是多个线程同时在运行。
      java语言本身就支持多线程。java中的多线程由虚拟的CPU、CPu所执行的代码和CPU所处理的数据3部分组成。虚拟处理器被封装在java.lang.Thread类中,有多少个线程就有多少个虚拟处理机在同时运行,提供对多线程的支持。java的多线程就是系统每次给java程序一个CPU时间,java虚拟处理机在多个线程之间轮流切换,保证每一个线程都能机会均等的使用CPU资源,不过每个时刻只能有一个线程在运行,java是从main方法入口执行程序,因此就启动了一个main线程,倘若java程序中还有其他没运行结束的线程,即使main方法执行完最后一句,java虚拟处理机也不会结束该程序,而是一直等到所有线程都运行结束后才停止。

     
    2.多线程的创建
       在java中可以通过java.lang.Thread类来实现多线程,有以下两种途径可以实现多线程的创建;一种是直接继承Thread类并重写其中的run()方法,另一种是使用Runnable接口,这两种途径都是通过run()方法来实现的,java语言把线程中真正执行的语句称为线程体,方法run()就是一个线程体,在一个线程被创建并初始化之后,系统就自动调用run()方法。

    2.1 Thread子类创建线程
       要实现多线程,可以通过继承Thread类并重写其中的run()方法来实现,把线程实现的代码写到run()方法中,线程从run()方法开始执行,知道执行完最后一行代码或线程消亡,
      java中Thread类的几个构造方法如下:
     public Thread();
     public Thread(Runnable target);
     public Thread(Runnable target,String name);
     public Thread(String name);
     public Thread(ThreadGroup group,Runnable target);
     public Thread(ThreadGroup group,String name);
     public Thread(ThreadGroup group,Runnable target,String name);
    其中,target通过实现Runnable接口来指明实际执行线程体的目标对象,name为线程名,java中每个线程都有自己的名称,可以给线程指定一个名称,当然如果不特意指定的话,java也会自动提供唯一的名称给每一个线程;group指明该线程所属的线程组。
     2.1.1继承Thread类创建线程
       public class MyMain{
         public static void mian(String[] args)
    {
       MyThread thread1=new MyThread("线程1");
       MyThread thread2=new MyThread("线程2");
       thread1.start();
       thread2.start();
    }
    }
    class  MyThread extends Thread
    {
      private String s;
    //构造函数,根据情况而定
      public MyThread(String str)
    {
      this.s=str
    }
    //重写run方法
      public void run()
    {
     for(int i=0;i<10;i++)
    {
      Sysout.out.println(s+"被调用");
      try{
           Thread.sleep(1000);//沉睡1秒
         }catch(InterrupteExption e)
        {

         }
         }
       System.out.println("调用结束");   
         }
        }

    2.1.2通过实现Runnable接口来创建线程 

    public class MyMain{
         public static void mian(String[] args)
    {
       new Thread(new MyThread("线程1")).start();
       new Thread(new MyThread("线程2")).start();
    }
    }
    class  MyThread implements Runnable{
      private String s;
    //构造函数,根据情况而定
      public MyThread(String str)
    {
      this.s=str
    }
    //重写run方法
      public void run()
    {
     for(int i=0;i<10;i++)
    {
      Sysout.out.println(s+"被调用");
      try{
           Thread.sleep(1000);//沉睡1秒
         }catch(InterrupteExption e)
        {

         }
         }
       System.out.println("调用结束");   
         }
        }


      以上就是java创建实现多线程的两种方式(方法是直接写出来的,没调试,如果有错误请自行改正),大家观察结果可能会发现,无论是继承Thread类和实现Runnable接口它们的结果都不是有序的,这只是线程的一角而已,具体原因请看线程的同步,本人会陆续的更新。


    2.3线程的生命周期及状态
     
    线程的生命周期是指从线程被创建开始到死亡的过程,通常包括5种状态:新建、就绪、运行、阻塞、死亡(五种状态我就不一一介绍)。在线程的生命周期内,这5中状态通过线程的调度而进行转换,转换关系如图所示:

      


     

    既然选择了远方,便只顾风雨兼程
  • 相关阅读:
    SpringCloud------链路追踪组件Sleuth
    SpringCloud------Zuul过滤器结合谷歌Gauva现实限流
    SpringCloud------Zuul网关
    极大团(maximal clique)算法:Born_kerbosch算法
    IDEA Cannot Resolve Symbol 问题的解决方法汇总
    idea 编译项目内存溢出OutMemoryError
    java 泛型和object比较
    java log4j 打日志到控制台同时打印到不同文件
    Java通过继承外部类来建立该外部类的protected内部类的实例(转)
    C#中的委托和事件
  • 原文地址:https://www.cnblogs.com/zhousen34/p/4732521.html
Copyright © 2011-2022 走看看