Java中创建线程有两种方式:
- 需要从java.lang.Thread类派生出一个新的子类,并在子类中重写Thread类中的run方法
- 需要实现java.lang.Runnable接口,并实现Runnable中的run方法
下面分别使用两种不同的方式,重写run方法,实现Java多线程操作
一、继承java.lang.Thread类
public class Hello extends Thread{ public Hello(){} public Hello(String name) { this.name = name; } @Override public void run() { for (int i = 0; i < 100; i++) { //造成一定的等待时间,可根据个人电脑快慢调整数字大小 for (int j = 0; j < 1000000; j++) ; System.out.println(name + "运行 " + i); } } public static void main(String[] args) throws InterruptedException { Thread h1 = new Hello("A"); Thread h2 = new Hello("B"); h1.run(); h2.run(); //用户观察主线程与子线程的执行标记 System.out.println("程序执行结束!"); } private String name; }
执行结果 写道
A运行 0
A运行 1
A运行 2
... ...
A运行 98
A运行 99
B运行 0
B运行 1
B运行 2
... ...
B运行 98
B运行 99
程序执行结束!
A运行 1
A运行 2
... ...
A运行 98
A运行 99
B运行 0
B运行 1
B运行 2
... ...
B运行 98
B运行 99
程序执行结束!
分析:当程序使用run方法的方式调用执行的时候,根据执行结果,可以清楚的看到,该代码在主线程启动后,顺序执行,即并无新的线程启动。
将上述代码中的run方法,替换为start方法,如下:
public static void main(String[] args) throws InterruptedException { Thread h1 = new Hello("A"); Thread h2 = new Hello("B"); h1.start(); h2.start(); //用户观察主线程与子线程的执行标记 System.out.println("程序执行结束!"); }
执行结果 写道
程序执行结束!
A运行 0
A运行 1
... ...
A运行 20
B运行 0
B运行 1
... ...
B运行 40
B运行 41
A运行 21
... ...
A运行 64
B运行 42
... ...
B运行 83
A运行 65
... ...
A运行 99
B运行 84
... ...
B运行 99
A运行 0
A运行 1
... ...
A运行 20
B运行 0
B运行 1
... ...
B运行 40
B运行 41
A运行 21
... ...
A运行 64
B运行 42
... ...
B运行 83
A运行 65
... ...
A运行 99
B运行 84
... ...
B运行 99
分析:当程序使用start方法的方式调用执行的时候,根据执行结果,程序的主线程首先执行完毕,紧接着,由程序的其他两个线程A和B分别交替进行,也就是说,主线程、线程A和线程B为三个独立的线程,并且,线程A和线程B均由主线程创建启动。线程A和线程B均通过start方法间接调用Hello类中的run方法执行相应的操作,并且相互之间独立运行。(可多执行几次,每次执行的结果可能会不同)
二、实现java.lang.Runnable接口
public class Hello implements Runnable{ public Hello(){} public Hello(String name) { this.name = name; } @Override public void run() { for (int i = 0; i < 100; i++) { //造成一定的等待时间 for (int j = 0; j < 1000000; j++) ; System.out.println(name + "运行 " + i); } } public static void main(String[] args) throws InterruptedException { Hello h1 = new Hello("A"); Hello h2 = new Hello("B"); Thread t1 = new Thread(h1); Thread t2 = new Thread(h2); t1.run(); t2.run(); //用户观察主线程与子线程的执行标记 System.out.println("程序执行结束!"); } private String name; }
分析:如上代码所示,由继承java.lang.Thread类改为实现java.lang.Runnable接口,main方法中,启动线程的代码有所改变,其余执行run方法和start方法的执行结果,与继承java.lang.Thread类时,并无区别
三、两种方法创建线程的区别
- Java中类仅支持单继承,也就是说定义一个新的类的时候,它只能扩展一个父类。因此,如果创建自定义线程类的时候是通过扩展java.lang.Thread实现的,那么自定义的类就不能再扩展其他类,也就是不能实现更复杂的功能。因此,如果自定义类必须扩展非java.lang.Thread的其它类那么就可以使用实现java.lang.Runnable接口的方式来自定义线程类,这样就可以避免由Java单继承所带来的局限性。
- 使用实现java.lang.Runnable接口的方式创建的线程可以处理同一资源,从而实现资源的共享。
四、小结
实现Runnable接口相对于扩展Thread类来说,具有无可比拟的优势。
- 适合多个相同的程序代码的线程去处理同一个资源
- 可以避免Java中单继承限制
- 增加程序的健壮性,代码可以被多个线程共享,代码和数据独立,特别适合多个具有相同代码的线程去处理同一资源的情况
注:本文源自互联网,经过查阅网上资料整理而成,如涉及到他人整理的成果,在此表示感谢。由于涉及到的参考文章比较多,在此就不再一一列举。
本文是目前个人理解的结果,仅供参考,如后续发现问题,本人会进行相应的更正,也欢迎各位对Java线程感兴趣的朋友或者前辈进行指正。
相关推荐
Java线程:创建与启动 7 Java线程:线程名称的设定及获取 10 Java线程:线程栈模型与线程的变量 12 Java线程:线程的调度-休眠 13 Java线程:线程的调度-优先级 16 Java线程:线程的调度-让步 19 Java线程:线程的...
java线程学习笔记
多线程学习笔记,通过平时的学习所做的一些笔记,希望对广大同仁有所帮助
java学习笔记2(多线程)java学习笔记2(多线程)
NULL 博文链接:https://baobeituping.iteye.com/blog/1190260
多线程学习笔记,关于创建线程,删除线程等相关指令的应用。
花费了一上午的时候 写了一些demo。认识到四种线程池的区别。上传到csdn 供以后学习
多线程学习笔记,好资源。包括线程基础等知识多线程学习笔记,好资源。包括线程基础等知识
学习目录:1. 线程简介 2. 线程实现(重点) 3. 线程状态 4. 线程同步(重点) 5. 线程通信问题 6. 高级主题
线程的基本概念 线程的创建和启动 线程的调度和优先级 线程的状态控制 线程同步
这篇文档和对应的源代码 博文链接:https://interper56-sohu-com.iteye.com/blog/172303
Java并发编程学习笔记,研究JAVA并发多线程编程的一本教程,使用并发技术可以开发出并行算法,充分利用多处理器的计算能力,避免硬件资源浪费。目前,在JAVA并发编程方面的论述系统且内容详实的技术资料不太多,Java...
基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码....
java学习笔记大全:java内容介绍 java编程可以分成三个方向: 1、java se (j2se)桌面开发 java中的基础中的基础 2、java ee (j2ee)web开发 3、java me (j2me)手机开发 java se课程介绍 java面向对象编程(基础) java...
java学习笔记5(java多线程)java学习笔记5(java多线程)
Java 并发学习笔记: 进程和线程, 并发理论, 并发关键字, Lock 体系, 原子操作类, 发容器 & 并发工具, 线程池, 并发实践 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的...
1 java起源 2 java语言概述 3 简单(基本)数据类型 4 运算符:java...8 继承:继承是面向对象编程技术的一块基石,因为它允许创建分等级层次的类 9 包和接口 10异常处理 11多线程编程 12输入/输出、小应用程序and others
JAVA多线程学习笔记整理(csdn)————程序