方式

  • 继承Thread类
  • 实现Runnable方法

实例

#继承Thread类

public class ThreadTest2 extends Thread {
private int threadCnt = 10; @Override
public void run() {
while (true) {
if (threadCnt > 0) {
System.out.println(Thread.currentThread().getName() + " 剩余个数 " + threadCnt);
threadCnt--;
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
break;
}
}
} public static void main(String[] args) {
new ThreadTest2().start();
new ThreadTest2().start();
}
}

执行

Thread-1 剩余个数 10
Thread-0 剩余个数 10
Thread-0 剩余个数 9
Thread-1 剩余个数 9
Thread-0 剩余个数 8
Thread-1 剩余个数 8
Thread-0 剩余个数 7
Thread-1 剩余个数 7
Thread-1 剩余个数 6
Thread-0 剩余个数 6
Thread-1 剩余个数 5
Thread-0 剩余个数 5
Thread-1 剩余个数 4
Thread-0 剩余个数 4
Thread-1 剩余个数 3
Thread-0 剩余个数 3
Thread-0 剩余个数 2
Thread-1 剩余个数 2
Thread-0 剩余个数 1
Thread-1 剩余个数 1

#实现Runnable方法

public class RunnalbleTest2 implements Runnable {
private int threadCnt = 10; @Override
public void run() {
while (true) {
if (threadCnt > 0) {
System.out.println(Thread.currentThread().getName() + " 剩余个数 " + threadCnt);
threadCnt--;
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
break;
}
}
} public static void main(String[] args) {
RunnalbleTest2 runnalbleTest2 = new RunnalbleTest2();
new Thread(runnalbleTest2).start();
new Thread(runnalbleTest2).start();
new Thread(runnalbleTest2).start();
new Thread(runnalbleTest2).start();
}
}

执行

Thread-0 剩余个数 10
Thread-1 剩余个数 10
Thread-2 剩余个数 8
Thread-3 剩余个数 7
Thread-1 剩余个数 6
Thread-3 剩余个数 5
Thread-2 剩余个数 6
Thread-0 剩余个数 6
Thread-1 剩余个数 2
Thread-0 剩余个数 2
Thread-2 剩余个数 2
Thread-3 剩余个数 2

可以看出该实例中虽然是2个线程,但操作的threadCnt却是一个,实现了资源共享。

比较

实现接口的方式比继承类的方式更灵活,也能减少程序之间的耦合度,面向接口编程也是设计模式6大原则的核心

start()方法和run()方法区别

涉及到线程的几个状态

新建状态:使用 new 关键字和 Thread 类(或其子类)建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序 start() 这个线程。

就绪状态:当线程对象调用了start()方法之后,该线程就进入就绪状态。就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度。

运行状态:如果就绪状态的线程获取到 CPU 资源,就可以执行 run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。

区别

只有调用了start()方法,才会表现出多线程的特性,不同线程的run()方法里面的代码交替执行。如果只是调用run()方法,那么代码还是同步执行的,必须等待一个线程的run()方法里面的代码全部执行完毕之后,另外一个线程才可以执行其run()方法里面的代码。测试如下

package com.jihite.helloworld.thread;

public class TestNoStart {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread() {
@Override
public void run() {
pong(1);
try {
Thread.sleep(7000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
Thread t2 = new Thread() {
@Override
public void run() {
pong(2);
try {
Thread.sleep(7000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
t1.start();
t2.start();
// t1.run();
// t2.run(); System.out.println("ping~~~~");
}
static void pong(int i) {
System.out.println("pong~" + i);
}
}

参考

Java 多线程编程

40个Java多线程问题总结

Java创建线程的两种方式的更多相关文章

  1. java创建线程的两种方式及源码解析

    创建线程的方式有很多种,下面我们就最基本的两种方式进行说明.主要先介绍使用方式,再从源码角度进行解析. 继承Thread类的方式 实现Runnable接口的方式 这两种方式是最基本的创建线程的方式,其 ...

  2. 当阿里面试官问我:Java创建线程有几种方式?我就知道问题没那么简单

    这是最新的大厂面试系列,还原真实场景,提炼出知识点分享给大家. 点赞再看,养成习惯~ 微信搜索[武哥聊编程],关注这个 Java 菜鸟. 昨天有个小伙伴去阿里面试实习生岗位,面试官问他了一个老生常谈的 ...

  3. 【java并发】传统线程技术中创建线程的两种方式

    传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...

  4. Java并发基础01. 传统线程技术中创建线程的两种方式

    传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...

  5. 创建线程的两种方式比较Thread VS Runnable

    1.首先来说说创建线程的两种方式 一种方式是继承Thread类,并重写run()方法 public class MyThread extends Thread{ @Override public vo ...

  6. Java新建线程的两种方式

    Java新建线程有两种方式,一种是通过继承Thread类,一种是实现Runnable接口,下面是新建线程的两种方式. 我们假设有个竞赛,有一个选手A做俯卧撑,一个选手B做仰卧起坐.分别为两个线程: p ...

  7. Java创建线程的四种方式

    Java创建线程的四种方式 1.继承Thread类创建线程 定义Thread类的子类,并重写该类的run方法,run()方法的内容就是该线程执行的内容 创建Thread子类的实例,即创建了线程对象. ...

  8. Java中创建线程的两种方式

    创建线程的第一种方式: 创建一个类继承Thread 重写Thread中的run方法 (创建线程是为了执行任务 任务代码必须有存储位置,run方法就是任务代码的存储位置.) 创建子类对象,其实就是在创建 ...

  9. Java并发编程:Java创建线程的三种方式

    目录 引言 创建线程的三种方式 一.继承Thread类 二.实现Runnable接口 三.使用Callable和Future创建线程 三种方式的对比 引言 在日常开发工作中,多线程开发可以说是必备技能 ...

随机推荐

  1. hdu 5099 简单模拟(比较型号)

    http://acm.hdu.edu.cn/showproblem.php?pid=5099 比较两个安卓手机型号,水题 注意点:A is actually implicit and usually ...

  2. To datafix AR DATE

    http://www.cnblogs.com/benio/archive/2012/07/07/2580203.html AR transactions should be created on 6- ...

  3. socket粗解

    百度定义:网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket通信流程: 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一 ...

  4. idea创建第一个maven web项目

    一.打开idea,File->New->Project.选择Mavne,勾选Create from archtype,选择org.apache.maven.archtypes:maven- ...

  5. C#单例类的实现

    C#单例类的实现 单例类保证一个类全局仅有一个实例,并提供一个全局访问点,由于只能生成一个实例,因此我们必须把构造函数设为私有函数以禁止他人创建实例. 实现1:懒汉式,线程不安全 该实现没有额外开销, ...

  6. 【.NET架构】BIM软件架构02:Web管控平台后台架构

    一.前言        之前一篇叙述的是Revit插件(桌面软件)的软件架构,本篇将开始叙述Web项目的架构方案.今年一月在老东家加入BIM平台部门,为一些大型国家项目搭建BIM管控平台,业主使用管控 ...

  7. ServiceStack 错误处理

    抛出C#异常 在大多数情况下,您不需要关心ServiceStack的错误处理,因为它为抛出C#异常的正常用例提供本机支持,例如: public object Post(User request) { ...

  8. MVC中通过ajax判断输入的内容是否重复(新手笔记,请各位多多指教)

    控制器代码: public string ValidateCarID(string carid)//这里接收ajax传递过来的值 { string result; Car car = db.Car.F ...

  9. ubuntu14.04 下出现 libmysqlclient.so.20 找不到问题

    解决办法: apt-get install libzdb-dev

  10. “全栈2019”Java多线程第三十六章:如何设置线程的等待截止时间

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 下一章 "全栈2019"J ...