• 多线程


    一.概念

       1.进程

          进程是一个独立运行的程序,一个进程里可以包含多个线程。

       2.线程

         线程是进程中的执行流程,多线程就是多个并发执行的线程。

         一个线程则是进程中的执行流程,一个进程中可以同时包括多个线程,每个线程也可以得到一小段程序的执行时间,这样一个进程就可以具有多个并发执行的线程。在单线程中,程序代码按调用顺序依次往下执行,如果需要―个进程同时完成多段代码的操作,就需要产生多线程。

         如图为Windows操作系统的执行模式:

         

    二.实现线程的两种方式

        在Java中主要提供了两种方式实现线程,分别为继承java.lang.Thread类与实现java.lang.Runnable接口。

        1.继承Thread     

          Thread类是java.lang包中的一个类,从这个类中实例化的对象代表线程,程序员启动一个新线程需要建立Thread实例。Thread类中常用的两个构造方法如下:
           public  Thread(String  threadName)
           public  Thread()
          其中第一个构造方法是创建一个名称为threadname的线程对象。
          继承Thread类创建一个新的线程的语法格式如下:
                       public class ThreadTest extends   Thread
                        {
                               //...
                        }
          完成线程真正功能的代码放在类的run()方法中,当一个类继承Thread类后,就可以在该类中覆盖run()方法,将实现该线程功能的代码写入run()方法中,然后同时调用Thread类中的start()方法执行线程,也就是调用run()方法。
         Thread对象需要一个任务来执行,任务是指线程在启动时执行的工作,该工作的功能代码被写在run()方法中。这个run()方法必须使用如下这种语法格式:
          public   void  run()
          {
                 //.... 
          }
          注意:如果start()方法调用一个已经启动的线程,系统将抛出IllegalThreadStateException异常。
          当执行一个线程程序时,就自动产生―个线程,主方法正是在这个线程上运行的。当不再启动其他线程时,该程序就为单线程程序。主方法线程启动由Java虚拟机负责,程序员负责启动自己的线程。
          语法格式如下:
                public static  void  main(String[]  args)
                {
                     new  ThreadTest().start();
                 } 
         2.实现Runnable接口
            到目前为止,线程都是通过扩展Thread类来创建的,如果程序员需要继承其他类(非Thread类)并使该程序可以使用线程,就需要使用Runnable接口。例如,一个扩展开jFrame类的GUI程序不可能再继承Thread类,因为Java语言中不支持多继承,这时该类就需要实现Runnable接口使其具有使用线程的功能。
            实现Runnable接口的语法格式如下:
                 public class Thread extends Obiect  imlpements  Runnable
            说明:实质上Thread类就是实现了Runnable接口,其中的run()方法正是对Runnable接口中的run()方法的具体实现。
            实现Runnable接口的程序会创建一个Thread对象,并将Runnable对象与Thread对象相关联。Thread类中有如下两个构造方法:
               public  Thread(Runnable r)
               public  Thread(Runnable r,String name)      
            这两个构造方法的参数中都存在Runnable实例,使用以上构造方法就可以将Runnable实例与Thread实例相关联。 
            使用Runnable接口启动新的线程的步骤如下:
                (1)建立Runnable对象;
                (2)使用参数为Runnable对象的构造方法创建Thread实例;
                (3)调用start()方法启动线程,
            通过Runnable接口创建线程时程序员首先需要编写一个实现Rmme接口的类,然后实例化该类的对象,这样就建立了Runnable对象;接下来使用相应的构造方法创建Thread实例;最后使用该实例调用Thread类中的start()方法启动线程。实现Runnable接口创建线程的流程如图所示:
            
            线程最引人注目的部分应该是与Swing相结合创建GUI程序。

           注意:启动一个新的线程,不是直接调用Thread子类对象的run()方法,而是调用Thread子类的start()方法,Thread类的start()方法产生一个新的线程,该线程运行Thread子类的run()方法。 

      线程代码演示:

     1 package org.hanqi.thred;
     2 
     3 //支持多线程
     4 //1.继承Thread
     5 //2.覆盖run方法
     6 public class TestThread1  extends Thread{
     7     
     8     //重写
     9     public void run()
    10     {
    11 
    12         for(int i=0;i<10;i++)
    13         {
    14             System.out.println(i);
    15             
    16             try {
    17                 
    18                 //线程的休眠方法 (毫秒)
    19                 Thread.sleep(1000);
    20                 
    21             }
    22             catch (InterruptedException e) 
    23             {
    24                 
    25                 e.printStackTrace();
    26             }
    27         }
    28         
    29 
    30     }
    31 }
    TestThread1 继承
     1 package org.hanqi.thred;
     2 
     3 public class TestThread2  implements Runnable{
     4 
     5     @Override
     6     public void run() {
     7 
     8         
     9         for(int i=0;i<10;i++)
    10         {
    11             System.out.println(i);
    12             
    13             try {
    14                 
    15                 //线程的休眠方法 (毫秒)
    16                 Thread.sleep(1000);
    17                 
    18             }
    19             catch (InterruptedException e) 
    20             {
    21                 
    22                 e.printStackTrace();
    23             }
    24         }
    25         
    26         
    27     }
    28     
    29 
    30 }
    TestThread2 接口
     1 package org.hanqi.thred;
     2 
     3 public class Test1 {
     4 
     5     public static void main(String[] args) {
     6 
     7 
     8         
     9         TestThread1  tt1=new TestThread1();
    10         
    11         //启动多线程
    12         tt1.start();
    13         
    14          TestThread1  tt2=new TestThread1();
    15         
    16         //启动多线程
    17         tt2.start();
    18         
    19         
    20         //启动实现接口方式的多线程
    21         
    22         Thread t3=new Thread(new TestThread2());
    23         
    24         t3.start();
    25     
    26         
    27         
    28         
    29     }
    30 
    31 }
    Test1 测试类

    小结:

  • 相关阅读:
    Android studio开发找不到HttpClient问题
    Android studio开发找不到HttpClient问题
    互联网应用之传递HTTP参数
    互联网应用之传递HTTP参数
    计算机组成原理
    计算机组成原理
    【NYOJ】[40]公约数和公倍数
    【NYOJ】[40]公约数和公倍数
    【NYOJ】[39]水仙花数
    【NYOJ】[39]水仙花数
  • 原文地址:https://www.cnblogs.com/arxk/p/5280194.html
Copyright © 2020-2023  润新知