Java多线程基础(二)

基本概念

进程:程序的执行过程。持有资源(共享内存、共享文件)和线程。

线程:

- 是一个程序内部的顺序控制流。

- 它包含在进程之中,是系统中最小执行单元,同一个进程可以有多个线程。

- 线程共享进程的资源。

线程和进程对比:

- 每个进程都有独立的代码和数据空间(进程上下文),进程切换的开销大。

- 线程:轻量的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。

多进程:在操作系统中,能同时运行多个任务(程序)。

多线程:在同一应用程序中,有多个顺序流同时执行。

线程的交互:

通过Thread类创建线程

Thread类

直接继承了Object类,并实现了Runnable接口。位于java.lang包中。

封装了线程对象需要的属性和方法

继承Thread类——创建多线程的方法之一

- 继承Thread类(从Thread类派生一个子类,并创建子类的对象)

- 子类应该重写Thread类的run方法,写入需要在新线程中执行的语句段

- 调用start方法来启动新线程,自动进入run方法

执行结果:

主线程开启

主线程结束

新线程开启

10:3628800

新线程结束

结果说明:

(1)main线程已经执行完后,新线程才开始执行完

(2)main方法调用thread.start()方法启动新线程后并不等待其run方法返回就继续运行,线程的run方法在一边独自运行,不影响原来的main方法的运行


线程的休眠

线程休眠的原因就是要让其他线程得到执行的机会。

如果启动新线程后希望主线程多持续一会再结束,可在start语句后加上让当前线程(这里当然是main)休眠1毫秒的语句。

执行结果:

主线程开启

新线程开启

10:3628800

新线程结束

主线程结束

案例2:开启三个线程,每个线程休眠0~6毫秒

执行结果:

开启线程

主线程结束

thread1准备休眠:2081

thread3准备休眠:5298

thread2准备休眠:2812

thread1休眠结束

thread2休眠结束

thread3休眠结束

说明:由于线程3休眠时间最长,所以最后结束,线程1休眠时间最短,所以最先结束。


学习检测

1、下列说法中错误的一项是

一个线程是一个Thread类的实例

线程从传递给纯种的Runnable实例run()方法开始执行

线程操作的数据来自Runnable实例

新建的线程调用start()方法就能立即进入运行状态 新建的线程调用start()方法就能立即进入运行状态 - 正确

2、下列关于Thread类提供的线程控制方法的说法中,错误的一项是

在线程A中执行线程B的join()方法,则线程A等待直到B执行完成

线程A通过调用interrupt()方法来中断其阻塞状态

若线程A调用方法isAlive()返回值为true,则说明A正在执行中

currentThread()方法返回当前线程的引用 currentThread()方法返回当前线程的引用 - 正确

3、下列关于线程的说法以中,正确的一项是

由同一类创建的多个线程都同时运行结束

创建线程只能通过继承java.lang.Thread类

调用suspend()方法暂停的一个线程将不会再被重新执行

程序的执行完毕与超级线程(daemon threads)无关 程序的执行完毕与超级线程(daemon threads)无关 - 正确


Thread类常用API

时间: 2024-11-07 18:06:09

Java多线程基础(二)的相关文章

Java多线程基础(二)

信号量Semaphore,类似于锁的功能,用于多线程中对一组资源的控制. acquire方法用于尝试获取一个资源,未获取前将一直等待.release用于释放一个资源,release的前提是已经获得了一个资源. package multiThread; import java.util.concurrent.Semaphore; public class SemaphoreTest { public static void main(String [ ] args) { int N = 8; //

Java多线程基础(二)定时器类:Timer类和TimerTask类

Java多线程基础(二)定时器类:Timer类和TimerTask类 Timer类和TimerTask类是jdk实现定时器功能的早期方法,jdk1.5以前就支持Timer类和TimerTask类.JDK1.5之后引入了新的机制,将在后续博文中研究. 1 指定时间间隔后执行任务 import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class TraditionalTimerTest {

[转]Java多线程干货系列—(一)Java多线程基础

Java多线程干货系列—(一)Java多线程基础 字数7618 阅读1875 评论21 喜欢86 前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程:进程中负责程序执行的执行单元线程本身依靠程序进行运行线程是程序中的顺序控制流,只能使用分配给程序的资源和环境 2 进程:执行中的程序一个进程至少包含一个线程 3 单线程:程序中只存在一个线程,实际上主方法就是一个主线程 4

Java多线程基础

1. 前言 这篇文章,是对Java多线程编程的基础性介绍. 文章将介绍Java语言为支持多线程编程提供的一些特性.通过这篇文章,您将了解到如何通过Java语言创建一个线程,如何通过内置的锁来实现线程间的同步,如何在线程间进行通信以及线程的中断机制. 2. 什么是线程 线程是操作系统调度的最小单位,在一个进程中,一般至少有一个线程在运行.一个进程中包含的多个线程,在多核处理器中,操作系统可以将多个线程调度到不同的CPU核心上运行,多个线程可以并行运行. 在同一个进程中的多个线程,共享同一个进程空间

Java多线程基础:进程和线程之由来

在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通使用的,需要在实践中不断积累.由于并发肯定涉及到多线程,因此在进入并发编程主题之前,我们先来了解一下进程和线程的由来,这对后面对并发编程的理解将会有很大的帮助. 下面是本文的目录大纲: 一.操作系统中为什么会出现进程? 二.为什么会出现线程? 三.多线程并发 若有不正之处,请多多谅解并欢迎指正. 请尊重作者劳动成果,转载请标明原文地址:

Java多线程基础(四)Java传统线程同步通信技术

Java多线程基础(四)Java传统线程同步通信技术 编写代码实现以下功能 子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程又循环100次,如此循环50次. 分析 1)子线程循环10次与主线程循环100次必须是互斥的执行,不能出现交叉,下面代码中通过synchronized关键字实现此要求: 2)子线程与主线程必须交替出现,可以通过线程同步通信技术实现,下面代码中通过bShouldSub变量实现此要求: 其他需要注意的地方 1)其中business变量必须声

java多线程基础知识

1.ThrTest.java 继承Thread类方式 public class ThrTest extends Thread { private String name; public ThrTest() { } public ThrTest(String name) { this.name = name; } public void run() { for (int i = 0; i < 5; i++) { System.out.println(name + "运行 " + i

黑马程序员——java多线程基础知识1

多线程 进程是一个正在执行的程序. cpu在同时执行这些程序,其实是跳跃式的,做快速的切换,时间很短.一个进程可能存在多条路径.迅雷的多路径.每一个进行执行都有一个执行顺序,该顺序是一个执行路径,或这叫一个控制单元.每一个进程至少有一个线程,线程就是进程中的一个独立的控制单元,线程控制进程的执行.jvm启动的时候会有一个进程就叫做java,exe,该进程中至少有一个线程在控制Java程序的执行 ,而且该线程的执行代码在 主函数中.该线程称为主线程.虚拟机至少也有两个线程,一个主线程执行,另一个负

黑马程序员——Java多线程基础知识2

多线程协同 线程间的通讯:我们对资源的操作动作不同,比如说两个卡车一个拉煤一个装煤.但是他们共享了一个资源. 怎么样把这个资源拿出来?怎样把车装满?这个资源当然是一个类,他里面的组成元素就是对象!!现在我们就要有操作对象的思想了,我用对象把这车装满,现在一车装一个对象. 等待唤醒机制: 用的不是sleep是wait.flag标记,这是两人沟通的方式.其实每个标记就要做一次等待或者notify,判断wait,改值notify.线程池.notify唤醒里面的线程,按顺序唤醒.wait和notify必

Java多线程基础总结

背景 Java采用多线程方式实现并行计算,当然并行计算也可以采用多进程方式实现,但是进程切换耗费比较高.而且进程间是隔离的,进程间通信机制比较麻烦,最后JVM本身在操作系统中就一个进程,由它再启动一个进程不太合适,所以Java采用多线程方式实现并行计算. Java从诞生之初,多线程就围绕的是Runnable接口和Thread类展开的.它的底层采用的是c的p线程方式,而且由于多线程的复杂性,p线程的很多概念知识被延伸到了Java层面,这对Java开发者来说算是一个不幸的消息.但是由于多线程的复杂性