进入正题前先了解两个名词,进程和线程。
进程:可以理解为一个应用程序,具有独立的存储空间。
线程:可称之为轻量级进程,占用资源小存在于进程中。所有线程共享进程公共内存。
总之进程和线程是(可以帮你完成某项任务的)两种基本单元。Java并发编程主要还是从线程出发。
什么是多线程
每个Java应用中都至少包含一个线程(main线程)。程序中的多个线程是“同时”被操作,从而提高运行效率的。对于单核CPU来说“同时”只是假象,在同一时间点有且仅有一个线程可以被执行。操作系统通过切分CPU时间,使得不同的线程在不同的时间切片上得到/失去执行权。
多线程技术的优点
1.线程相对于进程来说更加轻量,线程创建花费更少的资源和时间
2.线程间共享所属进程的公共内存
3.线程间上下文切换较进程有明显的优势
4.线程间的访问较进程更加简便
(线程的优点同时也是掌握它的难点,由于内存共享我们需要线程安全机制来确保多线程间的数据同步,关于这一部分我们后续再讨论)
关于线程创建API提供了两种实现方式
1.实现java.lang.Runnable接口
2.继承父类java.lang.Thread
实现Runnable接口
我们可以通过封装runnable类来创建线程。而runnable类是通过实现java.lang.Runnable接口以及它的run方法获得的。当线程被调用时,run方法被执行。下面是实现Runnable接口的例子。
public class HeavyWorkRunnable implements Runnable { @Override public void run() { System.out.println("Doing heavy processing - START "+Thread.currentThread().getName()); try { Thread.sleep(1000); //Get database connection, delete unused data from DB doDBProcessing(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Doing heavy processing - END "+Thread.currentThread().getName()); } private void doDBProcessing() throws InterruptedException { Thread.sleep(5000); } }
继承Thread父类
我们可以继承java.lang.Thread父类并重写run方法来创建线程。当线程被调用时,run方法被执行。下面是继承Thread父类创建线程的例子。
public class MyThread extends Thread { public MyThread(String name) { super(name); } @Override public void run() { System.out.println("MyThread - START "+Thread.currentThread().getName()); try { Thread.sleep(1000); //Get database connection, delete unused data from DB doDBProcessing(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("MyThread - END "+Thread.currentThread().getName()); } private void doDBProcessing() throws InterruptedException { Thread.sleep(5000); } }
测试类如下
public class ThreadRunExample { public static void main(String[] args){ Thread t1 = new Thread(new HeavyWorkRunnable(), "t1"); Thread t2 = new Thread(new HeavyWorkRunnable(), "t2"); System.out.println("Starting Runnable threads"); t1.start(); t2.start(); System.out.println("Runnable Threads has been started"); Thread t3 = new MyThread("t3"); Thread t4 = new MyThread("t4"); System.out.println("Starting MyThreads"); t3.start(); t4.start(); System.out.println("MyThreads has been started"); } }
输出结果为
Starting Runnable threads Runnable Threads has been started Doing heavy processing - START t1 Doing heavy processing - START t2 Starting MyThreads MyThread - START Thread-0 MyThreads has been started MyThread - START Thread-1 Doing heavy processing - END t2 MyThread - END Thread-1 MyThread - END Thread-0 Doing heavy processing - END t1
当线程进入可执行状态(调用start方法)后,线程的执行顺序就由操作系统决定,当被分配到CPU时间时线程进入执行状态。尽管我们可以设定线程的优先度,但是它不总是管用(线程调度并不归JVM管理)。所以当我们多次运行上面的测试类时,线程起止的顺序不是确定不变的。
Runnable VS Thread
如果你仅仅想创建一个线程去执行某项简单的任务你可以选择继承Thread父类。如果你想让程序更具有扩展性,执行更加多功能的任务你应该选择实现Runnable接口。
上面的话怎么理解呢,我们都知道Java API中一个类仅能继承一个父类,但是却可以实现复数个接口。个人更推荐通过实现Runnable接口的方式来创建线程。
学习笔记3中我们将探讨线程休眠的概念。
相关推荐
多线程学习笔记 iOS开发中,多线程是一种常见的技术手段,用于优化应用程序的性能,提升用户体验。多线程的核心是让程序能够并发地执行多个任务,合理地利用设备的计算能力,尤其是在拥有多个核心的处理器上。 ...
这篇学习笔记将深入探讨Java多线程的核心概念、实现方式以及相关工具的使用。 一、多线程基础 1. 线程与进程:在操作系统中,进程是资源分配的基本单位,而线程是程序执行的基本单位。每个进程至少有一个主线程,...
java学习笔记2(多线程)java学习笔记2(多线程)
Java多线程详解 在Java编程中,多线程是一种重要的技术,它使得程序能够同时执行多个任务,提高系统的效率和响应性。本教程将详细讲解Java中的多线程概念,包括...通过实践和不断学习,你将成为一个多线程编程的专家。
### Java多线程学习笔记 #### 一、线程的基本概念 在计算机科学中,**线程**(Thread)是程序执行流的最小单位。一个标准的程序只能做一件事情,而通过多线程技术,可以让程序同时处理多个任务。在Java中,线程是...
【UNIX多线程学习笔记】 在UNIX操作系统中,多线程是一种重要的编程模型,它允许多个执行流在单个进程中并发运行。多线程带来了许多优势,包括提高应用程序响应速度,充分利用多CPU系统的资源,以及优化程序结构,...
Java 线程学习笔记 Java 线程创建有两种方法: 1. 继承 Thread 类,重写 run 方法:通过继承 Thread 类并重写 run 方法来创建线程,这种方法可以使线程具有自己的执行逻辑。 2. 实现 Runnable 接口:通过实现 ...
多线程 学习笔记.md
在本文中,我们将深入探讨Java多线程的相关知识点,并结合提供的源代码进行学习。 1. **线程的创建** - **实现Runnable接口**:创建一个类实现Runnable接口,然后将其实例传递给Thread类的构造函数,如`Thread t =...
java基础:多线程学习笔记
生产者消费者模型是常见的多线程协作模式,通过`BlockingQueue`等工具实现线程间的通信和同步。死锁是指两个或更多线程相互等待对方释放资源而无法继续执行的情况,应避免创建这样的循环等待。线程之间的数据传递...
在IT领域,多线程是程序设计中...马士兵的多线程训练营资料1和资料2可能涵盖了以上这些知识点的详细讲解,通过学习这些内容,开发者可以掌握多线程编程的基本技能,解决实际项目中的并发问题,提升软件的性能和稳定性。
4、多线程下载:使用RandomAccessFile输出流写 5、多线程下载-断点续传:使用临时文件记录当前下载的数据,下次读取文件开始下载 6、下载显示进度条-ProgressBar 7、在gitbub上面下载已经有支持断点续传功能的代码...
这份"C++多线程学习笔记1"涵盖了基础到进阶的多线程概念,旨在帮助初学者快速掌握这一关键技能。 首先,C++11引入了对多线程的支持,引入了`<thread>`库,使得创建和管理线程变得简单。创建一个新的线程可以使用`...
本篇学习笔记主要涵盖了线程基础、threading模块的使用以及线程同步控制。 首先,线程是操作系统分配CPU执行时间的基本单位,一个进程可以包含多个线程。在Python3中,线程的状态主要包括新建、就绪、运行、死亡、...
2020-4-6 java笔记 --多线程 2020-4-8 java笔记 String类 2020-4-9 java 比较器 2020-4-10 java笔记 枚举类 2020-4-10 java 注解(Annotation) 2020-4-11 Java 集合 2020-4-15 java 泛型 2020-4-18 java IO流 2020-...
基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码....
本学习笔记将深入探讨Java多线程的相关知识,包括其原理、实现方式、同步机制以及常见问题。 ### 一、多线程的基本概念 多线程是指在一个程序中存在两个或更多的执行线程,这些线程共享同一内存空间,但各自拥有...