java中多线程的实现、常用操作方法、线程生命周期

导读:本篇文章讲解 java中多线程的实现、常用操作方法、线程生命周期,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

线程是什么?

      线程是比进程更小的执行单位,是程序运行的基本执行单元。合理地使用线程是减少开发和维护成本的必要条件,甚至能够改善复杂应用程序的性能。所谓多线程是指一个进程在执行过程中可以产生多个同时存在、同时运行的线程。

      多线程机制可以合理利用资源,提高程序运行效率。一个进程至少包含一个线程,程序运行时即自动产生一个线程,比如在 Java中主函数Main就是在线程上运行的。

java中多线程的实现有两种方法:

      Java中使用java.lang.Thread类控制线程,继承Thread的类就可以被称为多线程操作类。需要注意,在继承Thread类的子类中必须重写Thread类中的run( )方法,该方法为线程的主体。

      由于在Java中只允许单继承,所以某类若继承了Thread类,则必定会受到单继承局限性的影响,不能再继承其他类。为摆脱这种影响,可以通过实现Runnable接口的形式实现多线程。

      与继承Thread类相同,通过实现Runnable接口的方式实现多线程需要重写run( )方法,启动多线程需要使用start( )方法实现。继承了Thread的类可以直接完成启动,但实现Runnable接口的线程类需要通过Thread类中提供的public Thread(Runnable target)构造方法,实现线程的启动。

注意正确使用线程不能直接调用run()方法而是要调用从Thread类当中继承来的start()方法。

  • 继承Thread类,示例如下:

public class ThreadDemo2 extends Thread{
    private String name;
    public ThreadDemo2(String name){  
      this.name = name;    }   
 //重写Thread类中的方法 
   public void run() {  
      for(int i = 1;i <=5; i++){    
        System.out.println(name+"运行,i="+i); 
       }  
  } 
   public static void main(String[] args) {  
      new ThreadDemo2("线程A").start();   
     new ThreadDemo2("线程B").start();  
  }
 }
  • 实现Runnable接口 ,示例如下:
 //实现Runnable接口 
public class ThreadDemo3 implements Runnable{ 
   private String name;  
  public ThreadDemo3(String name) {    
    this.name = name;    
}    
public void run() {    
    for(int i=1;i<=15;i++){      
      System.out.println(name+"运行,i="+i);
        }   
 } 
public static void main(String[] args) {
   ThreadDemo3 demo1 = new ThreadDemo3("线程A"); 
   ThreadDemo3 demo2 = new ThreadDemo3("线程B"); 
   Thread t1 = new Thread(demo1);
  //实例化Thread类 
   Thread t2 = new Thread(demo2);        
   t1.start();//启动线程        
   t2.start();  
   } 
}

Thread类与Runnable接口的区别

在多线程的实现方式中,Thread类与Runnable接口在使用上是有区别的:

  • 继承了Thread的类不适合多个线程共享资源;
  • 而实现了Runnable接口可以方便地实现资源共享 

实现Runnable接口与继承Thread类在实现多线程中相比具备以下优势:

  • 适合多个具有相同程序代码的线程处理同一资源。
  • 可以避免Java的单继承特征带来的局限性。
  • 代码能够被多个线程共享且与数据独立存在,从而增加了程序的健壮性。

 线程常用操作方法:

方法 描述
public static Thread currentThread( ) 返回当前的线程
public final String getName( ) 返回线程名称
public final void setPriority(int priority) 设置线程优先级
public void start( ) 开始执行线程
public static void sleep(long  m) 使目前的线程休眠
public final void yield( ) 暂停目前的线程,运行其他线程
public void run( ) 执行线程

线程的生命周期:

1. 创建状态:程序中使用构造方法创建线程对象后,新线程对象即处于创建状态。线程此时已经具有相应的内存空间和其他资源但不可运行。
2. 就绪状态:线程对象创建后调用start( )方法启动线程,即进入就绪状态。就绪状态下的线程进入线程队列,等待CPU调用。
3. 运行状态:线程获得CPU服务后即处于运行状态,此时将自动调用线程对象的run( )方法。run( )方法定义了该线程的具体操作和实现功能。需要注意的是运行状态下的线程调用yield( )方法后,将从运行状态返回至就绪状态。
4. 阻塞状态:运行状态的线程调用sleep( )、wait( )等方法后将进入阻塞状态。线程阻塞条件解除后,线程再次转入就绪状态。
5. 终止状态:当线程执行run( )方法完毕后处于终止状态(又称死亡状态),处于终止状态下的线程不具有继续运行的能力。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/115851.html

(0)
Java光头强的头像Java光头强

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!