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接口的方式来创建多线程程序。

Java线程(一)——创建线程的两种方法的更多相关文章

  1. Solr创建Core的两种方法

    创建Core的两种方法: 第一种方法: 1.打开dos命令窗口,切换目录到${solr.home}\bin,然后输入:solr create -c corename之后回车: 2.打开solr安装文件 ...

  2. java 获取键盘输入常用的两种方法

    java 获取键盘输入常用的两种方法 方法1: 通过 Scanner Scanner input = new Scanner(System.in); String s = input.nextLine ...

  3. JS动态创建元素(两种方法)

    前言 创建元素有两种方法 1)将需要创建的元素,以字符串的形式拼接:找到父级元素,直接对父级元素的innnerHTML进行赋值. 2)使用Document.Element对象自带的一些函数,来实现动态 ...

  4. js如何动态创建表格(两种方法)

    js如何动态创建表格(两种方法) 一.总结 一句话总结: 1.方法一:写好创建表格的html代码,将之赋值给div的innerHTML. 2.方法二.直接用创建好的table元素的方法insertRo ...

  5. Vue 创建组件的两种方法

    地址:https://blog.csdn.net/cofecode/article/details/74634301 创建组件的两种方法 1.全局注册 2.局部注册 var child=Vue.ext ...

  6. Jmeter 跨线程组传递参数 之两种方法

    终于搞定了Jmeter跨线程组之间传递参数,这样就不用每次发送请求B之前,都需要同时发送一下登录接口(因为同一个线程组下的请求是同时发送的),只需要发送一次登录请求,请求B直接用登录请求的参数即可,直 ...

  7. Jmeter 跨线程组传递参数 之两种方法(转)

    终于搞定了Jmeter跨线程组之间传递参数,这样就不用每次发送请求B之前,都需要同时发送一下登录接口(因为同一个线程组下的请求是同时发送的),只需要发送一次登录请求,请求B直接用登录请求的参数即可,直 ...

  8. JMeter接口测试-跨线程组取参数值的两种方法

    前言 如果你工作中已经在用jmeter做接口测试,或性能测试了,你可能会遇到一个麻烦.那就是jmeter的变量值不能跨线程组传递.如果变量在开始测试之前已经确定了,我们可以用参数化关联就可以实现. 但 ...

  9. java中调用dll文件的两种方法

    一中是用JNA方法,另外是用JNative方法,两种都是转载来的, JNA地址:http://blog.csdn.net/shendl/article/details/3589676   JNativ ...

  10. Java加载资源文件的两种方法

    处理配置文件对于Java程序员来说再常见不过了,不管是Servlet,Spring,抑或是Structs,都需要与配置文件打交道.Java将配置文件当作一种资源(resource)来处理,并且提供了两 ...

随机推荐

  1. 一百一十三、SAP的SCAT录屏操作,类似按键精灵可用于批量修改数据

    一.输入事务代码SCAT,输入Z开头的程序名,点击左上角的新建图标 二.输入标题和模块名 三.保存为本地对象 四.包属性修改为CATT,然后保存 五.可以看到我们新建的一条内容,点击小铅笔修改 六.点 ...

  2. 062-PHP函数按值传参,交换数值函数

    <?php function swap($x,$y){ //定义交换数值函数 $temp=$x; $x=$y; $y=$temp; } $m=5; $n=15; echo "交换前:& ...

  3. C# SqlBulkCopy 避免插入重复数据(不重复即插入)

    之前写过一篇 C# SqlBulkCopy 大量数据导入到数据库 的文章介绍了大量数据导入到数据库的高效方法. 这篇文章与之有些关联,在这之前所想的是做全量插入,每次run这个job就会清空然后插入, ...

  4. PostAsync与GetAsync

    using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; u ...

  5. NumPy 矩阵库函数

    章节 Numpy 介绍 Numpy 安装 NumPy ndarray NumPy 数据类型 NumPy 数组创建 NumPy 基于已有数据创建数组 NumPy 基于数值区间创建数组 NumPy 数组切 ...

  6. 2016蓝桥杯决赛C/C++A组第四题 路径之谜

    题意: 小明冒充X星球的骑士,进入了一个奇怪的城堡.城堡里边什么都没有,只有方形石头铺成的地面. 假设城堡地面是 n x n 个方格.[如图1.png]所示. 按习俗,骑士要从西北角走到东南角.可以横 ...

  7. hostapd 热点设置

    一.  需要安装的服务:hostapd dhcp(isc-dhcp-server) dns(dnsmasq或者bind9或者都不装设成8.8.8.8 ) 二.建hostapd.conf文件   ,su ...

  8. 字符串匹配之BF算法

    1)算法原理 BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符:若不相等 ...

  9. Dubbo与Zookeeper 简介

    转自http://blog.csdn.net/congcong68/article/details/41113239 首先说一下Dubbo解决什么问题: (1)当服务越来越多时,服务Url配置管理变得 ...

  10. Codeforces 437D 贪心+并查集

    这个题目让我想起了上次在湘潭赛的那道跪死了的题.也是最值问题,这个也是,有n个动物园 每个都有权值 然后被m条路径相连接,保证图是连通的,然后求所有的p[i][j]之和.i,j为任意两个zoo,pij ...