Java中线程的创建有四i种方式:

1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中

2.  通过实现Runnable接口,实例化Thread类

3、应用程序可以使用Executor框架来创建线程池

4、实现Callable接口

一、通过继承Thread类实现多线程

class MyThread extends Thread{
String name = null;
int ticket = 0;
public MyThread(String name){
this.name = name;
}
public synchronized void run(){
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()+this.name+" ticket:"+ticket++);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }
}

实现方式:

public class TestThread {

   public static void main(String args[]) {
MyThread mThread1 = new MyThread("线程一");
MyThread mThread2 = new MyThread("线程二");
MyThread mThread3 = new MyThread("线程三");
mThread1.start();
mThread2.start();
mThread3.start();
}
}

输出结果:

Thread-0线程一 ticket:0
Thread-1线程二 ticket:0
Thread-2线程三 ticket:0
Thread-2线程三 ticket:1
Thread-1线程二 ticket:1
Thread-0线程一 ticket:1
Thread-2线程三 ticket:2
Thread-0线程一 ticket:2
Thread-1线程二 ticket:2
Thread-2线程三 ticket:3
Thread-0线程一 ticket:3
Thread-1线程二 ticket:3
Thread-2线程三 ticket:4
Thread-0线程一 ticket:4
Thread-1线程二 ticket:4

二、通过继承Runnable接口实现多线程

class RunThread implements Runnable{

    int Counter = 0;
@Override
public synchronized void run() {
for(int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+"count:"+Counter++);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

实现方式:

public class TestRunnable  {

       public static void main(String args[]) {
RunThread rThread = new RunThread();
Thread t1 = new Thread(rThread,"线程一");
Thread t2 = new Thread(rThread,"线程二");
Thread t3 = new Thread(rThread,"线程三");
t1.start();
t2.start();
t3.start();
}
}

输出结果:

线程一count:0
线程一count:1
线程一count:2
线程一count:3
线程一count:4
线程二count:5
线程二count:6
线程二count:7
线程二count:8
线程二count:9
线程三count:10
线程三count:11
线程三count:12
线程三count:13
线程三count:14

三、总结

实现Runnable接口相对于继承Thread类来说,有以下显著优势:

(1)适合多个相同程序代码的线程去处理同一资源的情况(资源共享)

(2)可以避免由于Java的单继承特性带来的局限,一个类可以继承多个接口

(3)挣钱了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的

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

  1. Java 创建线程的方式

    想必大家在Java面试中经常会被问到有关线程的问题,最常见的莫过于“Java有哪几种创建线程的方式呢?” 稍稍了解过,或者在日常开发中也都会用到以下几种方式: ①继承Thread类(真正意义上的线程类 ...

  2. Java学习笔记-多线程-创建线程的方式

    创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...

  3. Java多线程学习总结--线程概述及创建线程的方式(1)

    在Java开发中,多线程是很常用的,用得好的话,可以提高程序的性能. 首先先来看一下线程和进程的区别: 1,一个应用程序就是一个进程,一个进程中有一个或多个线程.一个进程至少要有一个主线程.线程可以看 ...

  4. -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中

     本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁  sleep()和wait()方法的区别 为什么wait( ...

  5. 操作系统实现线程的几种模式 和 java创建线程的3个方式

    操作系统实现线程的几种模式 和 java创建线程的3个方式  这是两个概念 在操作系统中,线程可以实现在用户模式下,也可以实现在内核模式下,也可以两者结合实现. 1.实现线程的三种方式: (1)继承t ...

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

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

  7. Java创建线程的三种主要方式

    Java创建线程的主要方式 一.继承Thread类创建 通过继承Thread并且重写其run(),run方法中即线程执行任务.创建后的子类通过调用 start() 方法即可执行线程方法. 通过继承Th ...

  8. java线程(1)——三种创建线程的方式

    前言 线程,英文Thread.在java中,创建线程的方式有三种: 1.Thread 2.Runnable 3.Callable 在详细介绍下这几种方式之前,我们先来看下Thread类和Runnabl ...

  9. java线程——三种创建线程的方式

    前言 线程,英文Thread.在java中,创建线程的方式有三种: 1.Thread 2.Runnable 3.Callable 在详细介绍下这几种方式之前,我们先来看下Thread类和Runnabl ...

随机推荐

  1. (二)PL/SQL特殊符号

    PL/SQL标识符 PL/SQL标识符是常量,变量,异常,过程,游标和保留字.标识符是由一个字母后面可以跟更多的字母,数字,美元符号,下划线和数字符号,并且不得超过30个字符. 默认情况下,标识符不区 ...

  2. SNMP History and OID/MIB Tour

    https://www.pei.com/snmp-history-oid-mib/ Description: This document describes a bit of history and ...

  3. docker企业级镜像仓库Harbor管理

    Harbor概述 Harbor是由VMWare公司开源的容器镜像仓库.事实上,Harbor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括: ...

  4. Libra教程之:move语言的特点和例子

    文章目录 move语言的特点 资源优先 灵活性 安全性 可验证性 Move语句初探 点对点支付交易脚本 Currency Module move语言的特点 Libra的目标是打造一个全球话的金融和货币 ...

  5. [转]探索 Android 内存优化方法

    前言 这篇文章的内容是我回顾和再学习 Android 内存优化的过程中整理出来的,整理的目的是让我自己对 Android 内存优化相关知识的认识更全面一些,分享的目的是希望大家也能从这些知识中得到一些 ...

  6. for-loop 与 json.Unmarshal 性能分析概要

    原文地址:for-loop 与 json.Unmarshal 性能分析概要 前言 在项目中,常常会遇到循环交换赋值的数据处理场景,尤其是 RPC,数据交互格式要转为 Protobuf,赋值是无法避免的 ...

  7. Omnicore RPC API中文文档

    2019独角兽企业重金招聘Python工程师标准>>> OmniCore是比特币核心的一个分支,它在比特币协议之上实现了一个新的Omni协议层,用于代币发行.众售等应用,USDT就是 ...

  8. element UI排坑记(一):判断tabs组件是否切换

    之所以将这个问题列在排坑记之中,是因为官方组件的一个属性颇有些隐蔽,这个问题曾经折腾了本人较多时间,始终思维固着,且使用搜索引擎也不容易搜索到答案,故记之.然而实际解决却是相当简单的. 一.问题描述 ...

  9. 狄慧201771010104《面向对象程序设计(java)》第十六周学习总结

    实验十六  线程技术 实验时间 2017-12-8 一.知识点总结: 1.程序与进程的概念 ‐程序是一段静态的代码,它是应用程序执行的蓝本. ‐进程是程序的一次动态执行,它对应了从代码加载.执行至执行 ...

  10. HDU 1874 畅通工程续 2008浙大研究生复试热身赛(2)

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...