线程与进程的关系:
进程 --运行中的程序。进程有如下特征:
1).独立性。拥有自己的资源,拥有自己独立的内存区。
通常来说,一个进程的内存空间,是不允许其他进程访问的。
但像Windows,如A进程可以通过某种方式修改其他进程的内存值。
2).动态性。程序是静止的,运行起来才叫进程。
3).并发性。一个操作系统可以同时“并发(concurrent)”运行多个进程。
线程 --进程中的“并发(concurrent)”执行流,轻量级进程。
线程与进程的典型区别:Process(进程)是有独立内存的,因此创建Process的成本比创建线程的成本高。
什么是“并发”?什么是“并行”?
1)并发:即使只有一个CPU,多个进程、或多个线程在CPU上【快速轮换】的执行。在同一个时刻,只有与CPU个数相同的进程真正在执行,其他进程都处于等待状态。--对用户来说,[感觉]是多个进程在同时执行。
2)并行(Parallel):必须有一个以上的cpu,在同一时刻,至少有与CPU个数相同的进程[真正]在执行。
多线程的好处:
1)功能上类似多进程;
2)创建成本低,效率高;
3)所有线程共享进程的内存,因此线程之间的通信非常方便。
Java创建多线程的方法(3种):(注意 Java默认有个main方法主线程的执行体)
启动线程:调用Thread对象的start()方法,千万不要调用run()方法。就是普通方法的调用,就不会启动多线程了。
a)继承Thread,重写一个run()方法,---这个run方法就是线程执行体(就是该线程将要做的事情)。
举列说明1:
public class Test extends Thread { @Override public void run() { for (int i = 0; i < 100; i++) { // Thread.currentThread()用于获取当前正在运行的线程 System.out.println(Thread.currentThread().getName() + ",i=" + i); } } public static void main(String[] args) { new Test().start();// 创建匿名实例并启动线程 } }
b)实现Runnable接口,重写run方法。--推荐
举例说明2:
public class Test implements Runnable { @Override public void run() { for (int i = 0; i < 100; i++) { // Thread.currentThread()用于获取当前正在运行的线程 System.out.println(Thread.currentThread().getName() + ",i=" + i); } } public static void main(String[] args) { new Thread(new Test()).start();// 这里把Runnable对象包装成Thread对象。 } }
c)实现Callable(就是Runnable增强版),重写call方法(有返回值,可以声明抛出异常)。
举例说明3:
public class Test implements Callable<Integer> { @Override public Integer call() throws Exception { for (int i = 0; i < 100; i++) { // Thread.currentThread()用于获取当前正在运行的线程 System.out.println(Thread.currentThread().getName() + ",i=" + i); } return 100; } public static void main(String[] args) { // 将Callable包装成FutureTask,再包装成Thread,最后启动线程 new Thread(new FutureTask<Integer>(new Test())).start(); ; } }
创建线程方式的对比,创建线程的方式可分为2类:
1。继承Thread类;2。实现Runnable或Callable接口。
总的来说,实现接口的方式更好,原因如下:
1.实现接口之后,依然可以继承其他类;但如果继承了Thread类,就无法继承其他类了。
2.实现接口时,可以让多个线程共享同一个Runnable对象。可以更好的实现代码与数据的分离,形成更清晰的逻辑。
线程的状态(当调用start()方法之后,只是启动了线程,线程并不会立即执行):
新建:刚刚创建出来的Thread对象。
就绪:调用start()之后,处于就绪状态。
从就绪到运行:是不可控的,靠线程调度器来分配。
从就绪到运行:靠线程调度器来分配(yield()方法可以主动的让出cpu,进入就绪状态)。
阻塞:调用sleep()、IO阻塞、等待同步锁、等待通知等将进入阻塞Blocked状态;sleep()时间到、IO阻塞解除、获取同步锁、收到通知后等将进入就绪状态。
正常死亡:线程执行体执行完成;遇到了未捕获的异常。
控制线程的方法:
Join线程:启动一条线程,多条线程并发执行,被joined线程必须先执行完成。
举例说明:
class JoinThread extends Thread { @Override public void run() { for (int i = 0; i < 100; i++) { // Thread.currentThread()用于获取当前正在运行的线程 System.out.println(Thread.currentThread().getName() + ",i=" + i); } } } public class Test { public static void main(String[] args) throws InterruptedException { JoinThread jt1 = new JoinThread(); JoinThread jt2 = new JoinThread(); for (int i = 0; i < 100; i++) { System.out.println("主线程正在执行:i=" + i); if (i == 20) { // 主线程执行到此处时,必须等到jt1、jt2执行完后,主线程才能继续向下执行。 jt1.start(); // 將jt1这条进程join进来, 等待jt1线程终止。 jt1.join(); jt2.start(); jt2.join(); } } } }
后台线程(Daemon Thread):又称守护线程、精灵线程。如果所有的前台线程结束,它会自动死亡。JVM的垃圾回收器就是一个典型的后台进程。调用Thread对象的setDaemon(true)方法可将指定线程设置为后台线程。
线程暂停:Thread.sleep(100):让线程暂停100ms,并且进入阻塞状态。--推荐(更稳定)
线程让步:Thread.yield():让线程让出cpu,并进入就绪状态。
改变线程的优先级:优先级越高,线程会获得更多的执行机会。
举例说明:(优先级高的先执行)
class PriorityThread extends Thread { @Override public void run() { for (int i = 0; i < 100; i++) { // Thread.currentThread()用于获取当前正在运行的线程 System.out.println(Thread.currentThread().getName() + ",i=" + i); } } } public class Test { public static void main(String[] args) throws InterruptedException { PriorityThread jt1 = new PriorityThread(); jt1.setPriority(Thread.MIN_PRIORITY); PriorityThread jt2 = new PriorityThread(); jt2.setPriority(Thread.MAX_PRIORITY); jt1.start(); jt2.start(); System.out.println("~~~~~~主线程结束~~~~~"); } }
相关推荐
面向对象程序设计JAVA 多线程自学教程ppt
面向对象的简、由类创建一个对象的方法、类的编写与对象的创建、类的构造函数、类的方法、修饰符、Java中的封装/继承/多态等特征、Java中的线程、用Java创建一个小世界、多线程共享数据,以及面向对象中的各种设计...
全书内容包括面向对象的编程思想、Java语言的基础知识、异常处理、类与对象的生命周期、多线程、Java集合、输入/输出和GUI编程等。其最大特色是以六条主线贯穿全书:面向对象编程思想、Java语言的语法、Java虚拟机...
本资源包含了该课程所有章节的课后习题答案,帮助学习者深入理解Java语言的面向对象特性。 1. **类与对象**:Java中的基本构建块是类,它代表了现实世界中的事物或概念。对象则是类的实例,具有类定义的属性和行为...
本文总结了 JAVA面向对象程序设计的知识点,涵盖了 Java 语言的基本语法、面向对象编程的概念、异常处理、多线程编程、网络编程、数据库编程等方面的知识,为学习和掌握 Java 语言提供了有价值的参考。
在Java编程中,多线程通信是一个至关重要的概念,特别是在设计高效的并发应用程序时。这个"Java线程通信示例源代码"很可能包含了演示如何在不同线程之间共享数据和协调执行顺序的实例。线程通信主要涉及两个核心概念...
Java学习系列(十四):Java面向对象之细谈线程、线程通信(上) 本章节主要讲解Java的线程编程,包括线程的创建、线程的启动、线程的同步等。 Java学习系列(十五):Java面向对象之细谈线程、线程通信(下) 本...
java 多线程 其实就是每个线程都拥有自己的内存空间,多线程之间的通信,比例A线程修改了主内存(main方法的线程)变量,需要把A线程修改的结果同步到主线程中,这时B线程再从主线程获取该变量的值,这样就实现了...
武汉理工大学面向对象与多线程Java综合实验源码 完成时间:2020/11/11 实验目的 运用Java语言,以迭代方式逐步编程实现一个小型档案管理系统。由此了解软件开发的一般过程,深入理解面向对象语言的基本概念和基本...
Java语言以其面向对象特性、平台无关性、安全性和多线程能力而备受青睐。 首先,学生需要掌握Java的基础知识,包括简单的Java程序设计。这涉及到学习如何使用基本的语法结构,如变量定义、数据类型、运算符、流程...
Java 面向对象程序设计(董小园版)收集.pdf ...本书是学习 Java 面向对象程序设计的优秀资源,涵盖了面向对象的基本概念、对象的属性和行为、继承和多态、异常处理、图形界面编程和多线程机制等方面的知识。
总的来说,C++和Java在面向对象编程上有许多共同点,但各自的侧重点不同。C++更适合需要底层控制和高效性能的场景,而Java则在跨平台应用和企业级开发中占据主导地位。本教程的中英文完整版将详细阐述这些差异,帮助...
Java面向对象程序设计是Java语言的核心特性之一,也是学习Java编程不可或缺的部分。本教程全面深入地探讨了这一主题,旨在帮助初学者和有一定基础的开发者更深入地理解面向对象编程的概念和实践。以下是对该教程内容...
综上所述,这个“java面向对象和多线程实验”涵盖了Java编程中的核心知识点,从面向对象的设计到多线程的实现,再到文件操作和异常处理,每一个环节都是构建高效、稳定的文档管理系统不可或缺的组成部分。...
Java 面向对象程序设计是 Java 语言的核心概念之一,对于 Java 程序员来说,掌握面向对象程序设计是非常重要的。本资源将为您提供 Java 面向对象程序设计的相关知识点,涵盖了 Java 的基础知识、面向对象编程的基本...
清华大学的耿祥义教授编写的教材是许多学习者深入理解Java面向对象编程的首选资料。这个压缩包中包含的就是这本教材中的例题源代码,对于初学者和进阶者来说都是宝贵的实践资源。 1. **面向对象编程基础**:Java是...
Java是一种广泛使用的面向对象编程语言,它以其平台独立性、高效性和丰富的类库而闻名。在"java 面向对象程序设计课件"中,我们可以深入探讨以下几个关键知识点: 1. **面向对象编程基础**:Java是面向对象的语言,...
这本书旨在帮助读者深入理解Java语言的面向对象特性,并通过一系列的实验指导和习题解答,提升实践能力。 在Java语言中,面向对象编程(Object-Oriented Programming,OOP)是其核心概念之一。它基于类和对象的概念...
在Java 2面向对象程序设计中,线程是内置支持的特性,使得Java成为构建并发应用的理想选择。 6.1 线程简介 线程可以理解为程序执行的独立路径,它们共享同一份程序资源,比如内存空间和代码。程序是静态的代码集合...
Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java...