java线程的基础实例解析

 更新时间:2017年12月26日 11:07:44   作者:SuPhoebe  
这篇文章主要介绍了java线程的基础实例解析,具有一定借鉴价值,需要的朋友可以参考下

java中建立线程可以有两种方式,分别是继承Thread类和实现Runnable接口。

继承Thread

public class MyThread extends Thread{ 
  public MyThread(String name){ 
   super(name); 
  } 
  int i; 
 public void run(){ 
  for(i=0;i<5;i++){ 
   System.out.println(getName()+"--"+i);   
  } 
 } 
 public static void main(String[] agrs){ 
  new MyThread("线程1").start(); 
  new MyThread("线程2").start(); 
 } 
} 
/*
线程1--0
线程1--1
线程1--2
线程1--3
线程1--4
线程2--0
线程2--1
线程2--2
线程2--3
线程2--4
*/

如上,java中的线程对象必须一个类的形式创建,而该类中必须重写基类的run()方法,该方法其实就是线程的执行体。调用该类实例的start方法则就隐式的调用了run方法。

不难看出,由于new了2次MyThread,所以两次的实例是不同的,即各自都有各自的i变量,相互独立。

Runnable接口

public class MyRunnable implements Runnable{ 
 int i; 
 public void run(){ 
  for(i=0;i<50;i++){ 
   System.out.println(Thread.currentThread().getName()+"--"+i);//不能直接this.getName() 
  } 
 } 
 public static void main(String[] agrs){ 
  MyRunnable myRun=new MyRunnable(); 
  new Thread(myRun,"线程1").start(); 
  new Thread(myRun,"线程2").start(); 
 } 
} 
/*
线程1--0
线程1--1
线程2--0
线程2--3
线程2--4
线程2--5
线程2--6
线程2--7
线程2--8
线程2--9
线程2--10
线程2--11
线程2--12
线程2--13
线程2--14
线程2--15
线程1--2
线程2--16
线程2--18
线程2--19
线程2--20
线程2--21
线程2--22
线程2--23
线程2--24
线程1--17
线程2--25
线程1--26
线程2--27
线程1--28
线程1--30
线程2--29
线程1--31
线程2--32
线程2--34
线程2--35
线程2--36
线程2--37
线程1--33
线程2--38
线程1--39
线程1--41
线程2--40
线程1--42
线程1--44
线程1--45
线程2--43
线程1--46
线程2--47
线程2--49
线程1--48
*/

可以看出,由于实现这种方式是将某一个对象做为target加载到Thread类上,所以即使new再多的Thread对象,只要target是同一引用的对象,则就调用该对象的run方法,所有线程均共享该target对象的资源,所以会看到线程1和线程2一共输出了51次,2条线程共同完成了i从0到49的输出,而并不像上面那样分别输出5次。至于为什么输出了51条,两条线程几乎在同一时刻进入就绪状态(start方法只是让线程进入就绪状态),观察上面的i变量不难发现当i等于0时,此时线程1和线程2均同时处于运行状态,产生了并发现象,共同输出了i=0,而此之后CPU通过不断的切换线程,使得在同一时刻只有一条线程在输出。

线程状态

线程分为4个状态

就绪状态:调用start方法则进入就绪状态。
运行状态:处于就绪状态的线程会被jvm进行调度从而成为运行状态。
阻塞状态:如有某些同步方法未返回结果则出现阻塞状态,或sleep和yeild。
死亡状态:方法体执行完毕或者强行stop某个线程。

线程的基本操作

join()合并线程:当前线程调用某线程的join方法后将会等待某线程执行完毕后本线程才会继续。
sleep(long milliseconds)线程睡眠:阻塞当前线程,只有阻塞的时间到了才会继续下去。再阻塞的同时,会将CPU占有权交给其他线程,所以常常利用sleep(1)来切换线程。
**yield()线程让步:**yeild类似与sleep,但是它只会让步于比自己级别高或者同级别的其他线程,若没有其他线程均比自己级别低则再次执行本线程。

后台线程

一个程序被操作系统执行后将有一个进程,一个进程至少有一个线程(主线程),主线程并没有比其他线程有太多的特殊之处,只因为它是最早被执行的线程,在主线程中将会创建其他线程,若不指明则默认创建的是前台线程(包括main线程),若调用setDaemon(true)则显式的将该线程设置为后台线程,后台线程为Daemon线程,从名字就能看出,它的主要作用是为其他线程提供守护,服务的功能。当所有前台线程结束后,后台线程将会被强制结束,因为它此时已经没有存在的意义了。

前台线程

public class ForeAndBackThread extends Thread{ 
 public ForeAndBackThread(String name){ 
  super(name); 
 } 
 public void run(){       
  int i; 
  for(i=0;i<9999;i++){ 
   System.out.println(this.getName()+"--"+i); 
  } 
 } 
 public static void main(String[] args){ 
  ForeAndBackThread th=new ForeAndBackThread("线程A"); 
  //th.setDaemon(true); 
  th.start(); 
  int j; 
  for(j=0;j<3;j++){ 
   System.out.println(Thread.currentThread().getName()+"--"+j); 
  } 
 } 
} 

程序完整的输出子线程中0到9998;说明主线程并没有什么特殊的,它的结束并不会影响其他前台线程的运行。

后台线程

public class ForeAndBackThread extends Thread{ 
 public ForeAndBackThread(String name){ 
  super(name); 
 } 
 public void run(){       
  int i; 
  for(i=0;i<9999;i++){ 
   System.out.println(this.getName()+"--"+i); 
  } 
 } 
 public static void main(String[] args){ 
  ForeAndBackThread th=new ForeAndBackThread("线程A"); 
  th.setDaemon(true); 
  th.start(); 
  int j; 
  for(j=0;j<3;j++){ 
   System.out.println(Thread.currentThread().getName()+"--"+j); 
  } 
 } 
} 

程序并不能完整的输出0-9998就退出了,说明前台主线程结束后,jvm强制结束了后台线程。

总结

以上就是本文关于java线程的基础实例解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

相关文章

  • Kotlin与java8的SAM转换对比(进阶)

    Kotlin与java8的SAM转换对比(进阶)

    这篇文章主要介绍了Kotlin与java8的SAM转换对比,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • Java及nginx实现文件权限控制代码实例

    Java及nginx实现文件权限控制代码实例

    这篇文章主要介绍了Java及nginx实现文件权限控制代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Java中实现线程的超时中断方法实例

    Java中实现线程的超时中断方法实例

    之前在使用Java实现熔断降级组件的时候,需要实现接口请求的超时中断,通过查找相关资料了解了相关的方法,下面这篇文章主要给大家介绍了关于Java中实现线程的超时中断的相关资料,需要的朋友可以参考下
    2018-06-06
  • JAVA定义变量与输出详解

    JAVA定义变量与输出详解

    这篇文章主要介绍了JAVA定义变量与输出详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • springboot使用spring-data-jpa操作MySQL数据库

    springboot使用spring-data-jpa操作MySQL数据库

    这篇文章主要介绍了springboot使用spring-data-jpa操作MySQL数据库,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • Spring中的FactoryBean与BeanFactory详细解析

    Spring中的FactoryBean与BeanFactory详细解析

    这篇文章主要介绍了Spring中的FactoryBean与BeanFactory详细解析,在Spring框架中,FactoryBean和BeanFactory是两个关键的接口,用于创建和管理对象实例,它们在Spring的IoC(Inversion of Control,控制反转)容器中发挥着重要的作用,需要的朋友可以参考下
    2023-11-11
  • Java实现利用图片或视频生成GIF并发送微信

    Java实现利用图片或视频生成GIF并发送微信

    这篇文章主要为大家详细介绍了Java语言如何利用图片或视频实现生成GIF并发送微信的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以尝试一下
    2022-11-11
  • Spring Cloud Consul的服务注册与发现

    Spring Cloud Consul的服务注册与发现

    这篇文章主要介绍了Spring Cloud Consul服务注册与发现的实现方法,帮助大家更好的理解和学习使用spring框架,感兴趣的朋友可以了解下
    2021-02-02
  • github上的java项目怎么运行(面向小白)

    github上的java项目怎么运行(面向小白)

    这篇文章主要介绍了github上的java项目怎么运行(面向小白),今天从github把我以前写的一个小demo下载下来了,第一次下载项目,摸索了一个多小时,才运行起来,需要的朋友可以参考下
    2019-06-06
  • SpringBoot + minio实现分片上传、秒传、续传功能

    SpringBoot + minio实现分片上传、秒传、续传功能

    MinIO是一个基于Go实现的高性能、兼容S3协议的对象存储,使用MinIO构建用于机器学习,分析和应用程序数据工作负载的高性能基础架构,这篇文章主要介绍了SpringBoot + minio实现分片上传、秒传、续传,需要的朋友可以参考下
    2023-06-06

最新评论