Java有两种方式实现多线程。

第一种——继承Thread类,并重写run方法

步骤:

  1. 定义类继承Thread类;
  2. 重写子类的run方法,将线程需要执行的代码写在run方法中;
  3. 创建子类的对象,则创建了线程对象;
  4. 调用该对象的start方法,开启线程。

实例:

public class MyThread extends Thread() {

    @Override
public void run() {
// 多线程代码
} // 其他代码 }
Thread t = new MyThread();
t.start();

第二种——实现Runnable接口,用该类的对象构造Thread类

步骤:

  1. 定义类实现Runnable接口;
  2. 实现接口中的run方法,将线程需要执行的代码写在run方法中;
  3. 用接口对象构造一个Thread对象;
  4. 调用Thread对象的start方法,开启线程。

实例:

public class MyClass implements Runnable() {

    public void run() {
// 多线程代码
} // 其他代码 }
MyClass m = new MyClass();
Thread t = new Thread(m);
t.start();

start方法的功能

  1. 启动了线程
  2. 让jvm调用了Thread类(或子类)对象的run方法

为什么可以有以上两种方式实现多线程?

对于第一种方式很容易理解。由于重写了Thread类的run方法,调用start方法启动线程后,jvm将调用子类重写的run方法;

对于第二种方式,调用start方法启动线程后,jvm将调用Thread类的run方法,其代码如下:

public void run() {
if (target != null) {
target.run();
}

}

其中target为Thread类的成员变量,类型为Runnable。在用Runnable对象构造Thread时,会使target引用该接口对象,所以执行target.run()时,实际上执行了接口对象的run方法。

Java多线程的使用以及原理的更多相关文章

  1. Java多线程——ThreadLocal类的原理和使用

    Java多线程——ThreadLocal类的原理和使用 摘要:本文主要学习了ThreadLocal类的原理和使用. 概述 是什么 ThreadLocal可以用来维护一个变量,提供了一个ThreadLo ...

  2. Java 多线程与并发【原理第二部分笔记】

    Java 多线程与并发[原理第二部分笔记] 什么是Java内存模型中的happens-before Java内存模型,即JMM,本身是一种抽象的概念,并不是真实存在的,他描述的是一组规则或者说是一种规 ...

  3. Java 多线程与并发【原理第一部分笔记】

    Java 多线程与并发[原理第一部分笔记] Synchronized synchronized的基本含义以及使用方式 在Java中线程安全问题的主要诱因就是存在共享数据(也称为临界资源)以及存在多条线 ...

  4. Java多线程编程——并发编程原理(分布式环境中并发问题)

    在分布式环境中,处理并发问题就没办法通过操作系统和JVM的工具来解决,那么在分布式环境中,可以采取一下策略和方式来处理: 避免并发 时间戳 串行化 数据库 行锁 统一触发途径 避免并发 在分布式环境中 ...

  5. java多线程:线程池原理、阻塞队列

    一.线程池定义和使用 jdk 1.5 之后就引入了线程池. 1.1 定义 从上面的空间切换看得出来,线程是稀缺资源,它的创建与销毁是一个相对偏重且耗资源的操作,而Java线程依赖于内核线程,创建线程需 ...

  6. Java多线程系列——线程池原理之 ThreadPoolExecutor

    ThreadPoolExecutor 简介 ThreadPoolExecutor 是线程池类. 通俗的讲,它是一个存放一定数量线程的线程集合.线程池允许多个线程同时运行,同时运行的线程数量就是这个线程 ...

  7. Java多线程:Automic包原理

    http://blog.csdn.net/zhangerqing/article/details/43057799 https://www.cnblogs.com/dengzz/p/5688021.h ...

  8. Java多线程系列——从菜鸟到入门

    持续更新系列. 参考自Java多线程系列目录(共43篇).<Java并发编程实战>.<实战Java高并发程序设计>.<Java并发编程的艺术>. 基础 Java多线 ...

  9. java多线程实现复制大文件

    有些开发的时候我们经常遇到这样一个问题,对大文件的处理.比如:日志文件.那么十几G的大文件.我们应该如何复制呢? 还有就是希望从本地和远程复制文件,文件都很大,10G级的如何办呢? 在这里我告诉你们, ...

随机推荐

  1. 【PAT】B1085 PAT单位排行(25 分)(c++实现)

    终于做的有点眉目了,今天学习了一点stl的皮毛,解题瞬间变容易了 下边开始分析本题 这道题如果用纯c解决实在太麻烦,试了半天两个超时,果断放弃,还是用map方便: 我的方法与柳神的方法是有区别的,我只 ...

  2. 房企大裁员;争议贺建奎;破产阴影下的ofo:4星|《财经》第29期

    <财经>2018年第29期 总第546期 旬刊 高水平的财经杂志.本期重要话题有:1:房企大裁员;2:争议贺建奎;3:破产阴影下的ofo; 总体评价4星,非常好. 以下是书中一些内容的摘抄 ...

  3. Unity RGBA16 + Dither

    游戏开发中有些场合,ETC或者说PVRTC压缩质量不满足的情况下,RGBA32(原图)对美术而言肯定可以满足的,但是RGBA32是不管是对内存占用内存太厉害. RGBA16/RGB16会减少内存的占用 ...

  4. JavaScript中遍历数组和对象的方法

    js数组遍历和对象遍历 针对js各种遍历作一个总结分析,从类型用处,分析数组和对象各种遍历使用场景,优缺点等 JS数组遍历: 1,普通for循环,经常用的数组遍历 var arr = [1,2,0,3 ...

  5. golang类型判断

    _.ok:=interface{}(a).(B) 此语句用于判断对象a是否是B类型 也可以判断对象a是否实现了B接口 package main import "fmt" type ...

  6. <20180929>任性的甲方

    今天参观了朋友在监督的新项目, 这个项目周期大概在6到9个月,预计本年度11月竣工. 总共大楼有五层, 施工面积在一万平米左右. 位于三楼的机房使用的设备有点高大上,发上来鉴赏一下. 双专线, 第二条 ...

  7. 解决Fatal error in launcher: Unable to create process using '"'

    问题 分析原因 网上看了很多方案都说直接运行 python3 -m pip install --upgrade pip 来升级pip版本就好了,这个在大多数情况下都是有用的.因为重装以后会根据更改后的 ...

  8. Random.nextInt()替换Math.random()

    在项目中使用哪个随机数 文章参考 http://liukai.iteye.com/blog/433718 今天用了find bugs后查出来了个问题 Google了下 发现 Random.nextin ...

  9. E325: ATTENTION

    vim/vi编辑器异常 E325: ATTENTION Found a swap file by the name "/usr/local/msmtp/etc/.msmtprc.swp&qu ...

  10. Qt5.9一个简单的多线程实例(类QThread)(第一种方法)

    Qt开启多线程,主要用到类QThread.有两种方法,第一种用一个类继承QThread,然后重新改写虚函数run().当要开启新线程时,只需要实例该类,然后调用函数start(),就可以开启一条多线程 ...