Thread 和 Runnable

  Java程序是通过线程执行的,线程在程序中具有独立的执行路径。当多条线程执行时,它们之间的路径可以不同,例如,一条线程可能在执行switch的一个case语句,另一条线程可能在执行另一个case语句。

  每个Java程序都有一个执行main()的默认主线程。应用程序也可以创建线程在后台操作时间密集型任务,以确保可以及时响应用户。这些封住了代码执行序列的线程对象被称为runnable.

  Java虚拟机给每条线程分配了独立的JVM栈空间以免彼此干预,独立的栈使得线程可以追踪它们自己要执行的下一条指令,这些指令会因为线程的不同而有所区别。栈空间也为每一条线程独立准备了一份方法参数,局部变量以及返回值的拷贝。

  Java程序主要是使用java.long.Thread类以及java.long.Runnable接口实现线程机制的。

使用Thread类来创建线程类

  • 定义一个Thread类的子类,该子类重写Thread类的run方法。run方法的方法体就代表了线程应该完成的任务,因此run方法的方法体也称为线程执行体。
  • 创建了Thread类的子类,既创建了该线程。
  • 调用线程的start方法来执行现场执行体。
    public class FristThread extends Thread{
    private int i;
    //重写run方法,run()方法就是执行体
    public void run() {
    for(;i<20;i++) {
    //当线程类继承Thread类时,直接使用this即可获取当前线程
    //Thread对象的getName()返回当前线程的名字
    System.out.println(getName()+" " +i);
    }
    } public static void main(String[] args) {
    for(int i=0;i<20;i++) {
    //调用Thread的currenThread方法获取当前正在执行的线程
    System.out.println(Thread.currentThread().getName()+" "+i);
    if(i==5) {
    //创建第一个线程
    new FristThread().start();
    //创建第二个线程
    new FristThread().start();
    }
    }
    }

  注意:当多个线程执行时,主线程是main。

  Thread.currentThread():是Thread类的静态方法,获取当前正在执行的线程。

  getName():Thread类的实例,是获取当前实例的名字。

实现Runnable接口来创建线程

  实现Runnable接口创建线程的方法

  •  定义Runnable接口的实现类,并重写接口中的 run方法。
  • 创建Runnable实现类的实例,并以此作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。

  Runnable对象仅仅是作为Thread对象的Target,Runnable实现类里包含的run()方法仅作为线程执行体。‘而实际的线程对象依然是Thread实例,只是该Thread线程负责执行其target的run()方法。

public class SecondThread implements Runnable {
private int i;
//run方法同样是线程执行体
public void run() {
for(;i<100;i++) {
//当线程类实现Runnable接口时
//如果想要获取当前线程,是能用Thread.currentThread()方法
System.out.println(Thread.currentThread().getName()+" " +i);
}
}
public static void main(String[] args) {
for(int i=0;i<100;i++) {
System.out.println(Thread.currentThread().getId()+" "+i);
if(i==20) {
SecondThread st=new SecondThread();
//通过new Thread(target,name)方法创建新线程
new Thread(st,"新线程1").start();
new Thread(st,"新线程2").start();
}
}
}
}

  Runnable类的实现原理:

 问题:如果是new Thread (new Runnable(){

             1. run(){} })

       {

       2. run(){}

      }时执行的是哪个方法?

  答:执行的是第二个方法,因为执行时会先去找Thread类的子类中的run()方法,子类线程中的run方法是重写的父类中的run方法,当没有子类重写的run方法,才会去找父类中的run方法,父类中的run方法才会去调用Runnable中的run方法。

两种创建线程的方法对比:

  使用Runnable接口创建的线程可以实现资源的共享,而Thread创建的线程则不可以。如果现实问题中要求必须创建多个线程来执行同一任务,而且这多个线程之间还将共享同一个资源,那么就可以使用实现Runnable接口的方式来创建多线程程序。

最新文章

  1. Struts2 Validation学习
  2. PHP之static静态变量详解(一)
  3. Linq创建带命名空间、前缀、Soap格式的XML
  4. JavaScript 页面模板引擎
  5. ecshop的弊病和需要修改的地方,持续更新
  6. Visual Studio 2010配置Opencv2.4.9
  7. JSP page指令详解
  8. ajaxFileUpload文件上传
  9. Lintcode: Flip Bits
  10. 软件密码和https协议
  11. lstm的debug模式下编译不行貌似
  12. C#调用C++ Dll
  13. winform CheckedListBox实现全选/全不选
  14. php以fastCGI的方式运行在iis下,遇到的文件系统权限问题及解决方法
  15. .NET Core TDD 前传: 编写易于测试的代码 -- 缝
  16. java中this的N种使用方法
  17. 浅析MySQL中concat以及group_concat的使用
  18. search文件中的config
  19. java使用POI实现excel文件的读取,兼容后缀名xls和xlsx
  20. Hashmap jdk7 死循环

热门文章

  1. Vulkan SDK之Vertex Buffer
  2. TensorFlow2 Part2:基础知识回顾
  3. composer install、require、update的区别
  4. python中MD5使用练习
  5. Fragment 知识巩固
  6. MyBatis的初始化过程。
  7. mybatis初步配置容易出现的问题
  8. select、poll和epoll机制
  9. 爬虫(十八):Scrapy框架(五) Scrapy通用爬虫
  10. C# 对CSV 读写