初识线程
每当我们提起线程,可能会将其与进程或者程序的概念混淆,无法区分这三者之间的关系。现在,让我来梳理梳理这三个概念的区别。程序是代码、文件等得集合,是静态的,可以复制到不同的计算机上;进程是执行中的程序,是动态的,无法复制到其他计算机中;线程是进程中的执行单位,同个进程下的线程共用进程中的内存资源。以学校上课为例:程序相当于同一年级的教学安排表,适用于不同的班级;进程相当学校上课,切切实行教学安排表;线程就类似于每一个上课的班,班里的每一个同学,相当于没有具有具体行为的对象。
在Java中实现线程有两种方式:通过继承java.lang.Thread类;通过实现java.lang.Runnable接口。
通过继承Thread类实现线程主要是重写run()方法——将执行代码添加到run()方法中。
/** * 学校类 * @author Daily * */ public class School { /** * 主进程入口 * @param args */ public static void main(String[] args) { Teaching teach1=new Teaching(); // 创建第一个教学线程对象 Teaching teach2=new Teaching(); // 创建第二个教学线程对象 teach1.start(); // 调用第一个线程对象的启动方法 teach2.start(); // 调用第二个线程对象的启动方法 } } /** * 自定义一个上课线程类 * @author Daily * */ public class Teaching extends java.lang.Thread{ private int[] a={1,2,3,4,5,6,7}; // 上课班级课程序号 private java.util.Random ran=new java.util.Random();// 随机数对象,每个班上课时间、上课课程可能不一样 /** * 重写run()方法,将实现代码加入此方法中 */ public void run(){ for (int i=0;i<7;i++){ System.out.println(currentThread().getName()+"在上"+a[ran.nextInt(7)]+"号课程"); } } }
通过实现Runnable接口,并通过Thread类创建线程对象。
/** * 学校类 * @author Daily * */ public class School { /** * 主进程入口 * @param args */ public static void main(String[] args) { Teaching1 teach1=new Teaching1(); // 创建第一个教学线程对象 Teaching1 teach2=new Teaching1(); // 创建第二个教学线程对象 /*--------------------这两个对象共同完成一个教学安排--------------*/ Thread thread1=new Thread(teach1); // 根据teach1创建第一个线程对象 Thread thread2=new Thread(teach1); // 根据teach1创建第二个线程对象 /*-------------------------------------------------------*/ /*--------------------这个对象自己完成一个教学安排---------------*/ Thread thread3=new Thread(teach2); // 根据teach2创建第三个线程对象 /*------------------------------------------------------*/ thread1.start(); // 调用第一个线程对象的启动方法 thread2.start(); // 调用第二个线程对象的启动方法 thread3.start(); // 调用第三个线程对象的启动方法 } } /** * 实现Runnable接口的上课类 * @author Daily * */ public class Teaching1 implements java.lang.Runnable{ private int[] a={1,2,3,4,5,6,7}; // 上课班级课程序号 private java.util.Random ran=new java.util.Random();// 随机数对象,每个班上课时间、上课课程可能不一样 /** * 重写run()方法,同样将执行代码加入此方法中 */ public void run() { for (int i=0;i<7;i++){ System.out.println(Thread.currentThread().getName()+"在上"+a[ran.nextInt(7)]+"号课程"); } } }
切忌主函数直接调用线程的run()方法。线程类主要是通过start()方法实现了线程方法,如果直接调用我们重写的方法,那么就是Thread类失去了其存在的意义,此时我们任然实现的是单线程——>主线程,而非多线程。
相关推荐
初识线程 线程是一个独立的运行单元,每个进程内部都有多个线程,每个线程都可以各自同时执行指令。每个线程都有自己独立的栈,但是与进程内的其他线程共享内存。但是对于.NET的客户端程序(Console,WPF,WinForms...
如今关于iOS多线程的文章层出不穷,但我觉得若想更好的领会各个实践者的文章,应该先仔细读读官方的相关文档,打好基础,定会有更好的效果。文章中有对官方文档的翻译,也有自己的理解,官方文档中代码片段的示例在...
本文将详细讲解如何初识通信,并以多线程服务器的构建为例,来阐述相关技术点。 首先,理解多线程的概念至关重要。多线程是指在一个进程中可以同时执行多个线程,这样可以充分利用CPU资源,提高程序的执行效率。在...
在头歌平台初识Redis的答案可以总结如下: 一、基础知识 Redis数据库数量: Redis默认有16个数据库,可以使用select命令进行切换。 数据库大小与键的查看: 使用DBSIZE命令查看当前数据库的大小(即键的数量)。 ...
使用方法与介绍,请参考系列文章——【深海王国】小学生都能做的语音模块?
9. **多线程**:了解线程的创建方式,同步机制(synchronized关键字、wait()、notify()、notifyAll()),以及线程池的使用。 10. **文件与目录操作**:学习如何在Java中创建、读取、修改和删除文件及目录。 11. **...
* 创建线程池时,初识化核心线程数和最大线程数 * 当有新的任务提交时,检查是否有空闲线程,如果有,则将任务分配给空闲线程 * 如果没有空闲线程,则检查是否已经达到最大线程数,如果没有,则创建新的线程 * 如果...
8.初识Lock与AbstractQueuedSynchronizer(AQS) 9.深入理解AbstractQueuedSynchronizer(AQS) 10.彻底理解ReentrantLock 11.深入理解读写锁ReentrantReadWriteLock 12.详解Condition的await和signal等待通知机制 13....
多线程 目录 进程 进程的了解 线程 什么是线程 线程的组成 线程的创建 线程的状态 线程的方法 线程的安全问题 1.进程 1.1.进程的了解 简单的来说进程就是运行中的程序,简称为进程。 单核CPU在任意一个时间节点上,...
1. 进程是什么 windows电脑中,打开任务管理器,可以看到电脑中执行的每一个程序,每一个程序就是一个进程。 Windows系统是一个多任务系统。 电脑可以同时执行多个程序。...线程抢占过程就类似于进
Java语言技术初识 Java,作为一种革命性的编程语言,由Sun Microsystems公司的James Gosling等人于1991年创立,并于1995年正式发布。它的核心特性是跨平台能力,这得益于Java虚拟机(JVM),使得“编写一次,到处...
【初识Java】 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(后被Oracle公司收购)于1995年发布。它的设计目标是具备“简单性、面向对象、健壮性、安全性、可移植性、高效性、多线程和动态性”等...
本篇文章将围绕《头歌初识Redis答案》的内容进行展开,详细介绍Redis的基础知识、数据类型及操作、事务与监视机制、持久化策略以及主从同步等方面的内容。 #### 基础概念 - **内存存储**:Redis主要基于内存进行...
**Maven3之初识** Maven,一个在Java开发领域广泛应用的项目管理和综合工具,是Apache软件基金会的一个重要项目。它的核心目标是简化构建过程,通过提供一套标准的方式来管理项目的构建、报告和文档。Maven3是Maven...
### 头歌初识Redis知识点详解 #### 一、Redis基础知识概述 Redis是一种开源的、高性能的键值存储系统,以其快速的数据存取速度而著称。它支持多种数据结构,能够满足不同的应用场景需求。 - **数据库管理**: - ...