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 线程学习笔记 Java 线程创建有两种方法: 1. 继承 Thread 类,重写 run 方法:通过继承 Thread 类并重写 run 方法来创建线程,这种方法可以使线程具有自己的执行逻辑。 2. 实现 Runnable 接口:通过实现 ...
这篇学习笔记将深入探讨Java多线程的核心概念、实现方式以及相关工具的使用。 一、多线程基础 1. 线程与进程:在操作系统中,进程是资源分配的基本单位,而线程是程序执行的基本单位。每个进程至少有一个主线程,...
多线程学习笔记 iOS开发中,多线程是一种常见的技术手段,用于优化应用程序的性能,提升用户体验。多线程的核心是让程序能够并发地执行多个任务,合理地利用设备的计算能力,尤其是在拥有多个核心的处理器上。 ...
java学习笔记2(多线程)java学习笔记2(多线程)
Java线程是多任务编程的重要组成部分,它允许程序同时执行多个独立的代码片段,从而提高程序的效率和响应性。本文将深入探讨Java线程的概念、原理以及如何在实际编程中进行有效管理。 首先,我们要了解操作系统中的...
本教程将详细讲解Java中的多线程概念,包括线程的创建、状态、同步以及高级主题,旨在帮助初学者逐步掌握这一关键技能。 1. **线程简介** - 线程是操作系统分配CPU时间的基本单位,一个进程可以有多个线程,它们...
4. 多线程:在10多线程.md中,介绍了如何创建和管理Java线程,包括Thread类、Runnable接口,以及同步机制如synchronized关键字、wait()、notify()和notifyAll()方法。多线程技术是实现并发执行的关键,有助于提高...
### Java多线程学习笔记 #### 一、线程的基本概念 在计算机科学中,**线程**(Thread)是程序执行流的最小单位。一个标准的程序只能做一件事情,而通过多线程技术,可以让程序同时处理多个任务。在Java中,线程是...
java基础:多线程学习笔记
首先,标题中的“Java线程编程学习笔记(二)”表明这是系列教程的第二部分,暗示了前一部分可能已经介绍了线程的基础概念,如如何创建线程(通过实现Runnable接口或继承Thread类)、线程的状态(新建、就绪、运行、...
Java学习笔记 Java是一种流行的编程语言,广泛应用于Android应用程序开发、Web应用程序开发、桌面应用程序开发等领域。以下是Java学习笔记的摘要信息: 一、Java技术基础 * 1.1 编程语言:Java是一种面向对象的...
以下是一些关于多线程的重要知识点,特别是关于在Linux和Windows环境下创建和管理线程的关键指令。 1. **线程状态**: - **Joinable状态**:这是大多数线程的默认状态。在这种状态下,当线程完成执行后,其资源...
【Java学习笔记Markdown版】是针对Java初学者和进阶者的一份详尽教程,以Markdown格式编写,便于阅读和整理。Markdown是一种轻量级的标记语言,它允许用户使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML...
7. 多线程:Java内置了对多线程的支持,通过Thread类或实现Runnable接口创建线程。线程同步机制包括synchronized关键字、wait()、notify()和notifyAll()方法,以及Lock接口和相关的实现类。 8. 数据库操作:Java ...
花费了一上午的时候 写了一些demo。认识到四种线程池的区别。上传到csdn 供以后学习
- Java线程有10个优先级,从MIN_PRIORITY(1)到MAX_PRIORITY(10),默认优先级是NORM_PRIORITY(5)。 - 优先级高的线程并不保证一定先执行,线程调度还受到操作系统的限制。 6. **线程中断** - **interrupt()...
在本学习笔记中,我们将探讨如何使用Java的Socket编程实现多线程服务器,特别是通过ExecutorService创建线程池来处理客户端的并发请求。ExecutorService是一个高级的线程管理工具,它允许我们更有效地管理和控制线程...