本文目录一览:
java多线程编程中涉及的基础知识点?
线程设计在软件开发领域中是非常常见的一个设计构成,今天昆明北大青鸟就一起来了解一下,java多线程编程中都涉及到了哪些基础知识点。
顺序
用于表示多个操作“依次处理”。比如把十个操作交给一个人来处理时,这个人要一个一个地按顺序来处理
并行
用于标识多个操作“同时处理”。比如十个操作分给两个人处理时,这两个人就会并行来处理。
并发
相对于顺序和并行来说比较抽象,用于表示“将一个操作分割成多个部分并且允许无序处理”。比如将十个操作分成相对独立的两类,这样便能够开始并发处理了。如果一个人来处理,这个人就是顺序处理分开的并发操作,而如果是两个人,这两个人就可以并行处理同一个操作。
总结
多线程程序都是并发处理的。如果CPU只有一个,那么并发处理就是顺序执行的,而如果有多个CPU,那么并发处理就可能会并行运行。
等待队列
所有实例都拥有一个等待队列,它是在实例的wait方法执行后停止操作的线程队列。就好比为每个实例准备的线程休息室
在执行wait方法后,线程便会暂停操作,进入等待队列这个休息室。除非发生下列某一情况,否则线程会一直在等待队列中休眠。
有其他线程的notify方法来唤醒线程
有其他线程的notifyAll方法来唤醒线程
有其他线程的interrupt方法来唤醒线程
wait方法超时
notify方法
该方法会将等待队列中的一个线程去除。同wait方法一样,若要执行notify方法,线程也必须持有要调用的实例的锁。
notifyAll方法
notify方法仅唤醒一个线程,而notifyAll则唤醒所有线程,这是两者之间的区别
同wait方法和notify方法一样,notifyAll方法也只能由持有要调用的实例锁的线程调用
notify和notifyAll选择
notify方法和notifyAll方法非常相似,到底该使用哪个?
实际上,这很难选择,由于notify唤醒的线程较少,所以处理速度要比使用notifyAll时快。但使用notify时,如果处理不好,程序便可能会停止。一般来说,使用notifyAll时的代码要比使用notify时的更为健壮。
Java多线程编程基础之线程和多线程
随着计算机技术的发展 编程模型也越来越复杂多样化 但多线程编程模型是目前计算机系统架构的最终模型 随着CPU主频的不断攀升 X 架构的硬件已经成为瓶 在这种架构的CPU主频最高为 G 事实上目前 G主频的CPU已经接近了顶峰
如果不能从根本上更新当前CPU的架构(在很长一段时间内还不太可能) 那么继续提高CPU性能的方法就是超线程CPU模式 那么 作业系统 应用程序要发挥CPU的最大性能 就是要改变到以多线程编程模型为主的并行处理系统和并发式应用程序
所以 掌握多线程编程模型 不仅是目前提高应用性能的手段 更是下一代编程模型的核心思想 多线程编程的目的 就是 最大限度地利用CPU资源 当某一线程的处理不需要占用CPU而只和I/O OEMBIOS等资源打交道时 让需要占用CPU资源的其它线程有机会获得CPU资源 从根本上说 这就是多线程编程的最终目的
第一需要弄清的问题
如同程序和进程的区别 要掌握多线程编程 第一要弄清的问题是 线程对象和线程的区别
线程对象是可以产生线程的对象 比如在java平台中Thread对象 Runnable对象 线程 是指正在执行的一个指点令序列 在java平台上是指从一个线程对象的start()开始 运行run方法体中的那一段相对独立的过程
鉴于作者的水平 无法用更确切的词汇来描述它们的定义 但这两个有本质区别的概念请初学者细细体会 随着介绍的深入和例程分析的增加 就会慢慢明白它们所代表的真实含义
天下难事必始于易 天下大事必始于细
让我们先从最简单的 单线程 来入手 ( )带引号说明只是相对而言的单线程 ( )基于java
class BeginClass{ public static void main(String[] args){ for(int i= ;i ;i++) System out println( Hello World! ); } }
如果我们成功编译了该java文件 然后在命令行上敲入
java BeginClass
现在发生了什么呢?每一个java程序员 从他开始学习java的第一分钟里都会接触到这个问题 但是 你知道它到底发生发什么?
JVM进程被启动 在同一个JVM进程中 有且只有一个进程 就是它自己 然后在这个JVM环境中 所有程序的运行都是以线程来运行 JVM最先会产生一个主线程 由它来运行指定程序的入口点 在这个程序中 就是主线程从main方法开始运行 当main方法结束后 主线程运行完成 JVM进程也随之退出
我们看到的是一个主线程在运行main方法 这样的只有一个线程执行程序逻辑的流程我们称
之为单线程 这是JVM提供给我们的单线程环境 事实上 JVM底层还至少有垃圾回收这样的后台线程以及其它非java线程 但这些线程对我们而言不可访问 我们只认为它是单线程的
主线程是JVM自己启动的 在这里它不是从线程对象产生的 在这个线程中 它运行了main方法这个指令序列 理解它 但它没有更多可以研究的内容
接触多线程
class MyThread extends Thread{ public void run(){ System out println( Thread say:Hello World! ); } } public class MoreThreads{ public static void main(String[] args){ new MyThread(); new MyThread() start(); System out println( Main say:Hello World ); } }
执行这个程序 main方法第一行产生了一个线程对象 但并没有线程启动
main方法第二行产生了一个线程对象 并启动了一个线程
main方法第三行 产生并启动一个线程后 主线程自己也继续执行其它语句
lishixinzhi/Article/program/Java/gj/201311/27552
什么是Java多线程编程?
一、 什么是多线程:
我们现在所使用操作系统都是多任务操作系统(早期使用的DOS操作系统为单任务操作系统),多任务操作指在同一时刻可以同时做多件事(可以同时执行多个程序)。
多进程:每个程序都是一个进程,在操作系统中可以同时执行多个程序,多进程的目的是为了有效的使用CPU资源,每开一个进程系统要为该进程分配相关的系统资源(内存资源)
多线程:线程是进程内部比进程更小的执行单元(执行流|程序片段),每个线程完成一个任务,每个进程内部包含了多个线程每个线程做自己的事情,在进程中的所有线程共享该进程的资源;
主线程:在进程中至少存在一个主线程,其他子线程都由主线程开启,主线程不一定在其他线程结束后结束,有可能在其他线程结束前结束。Java中的主线程是main线程,是Java的main函数;
二、 Java中实现多线程的方式:
继承Thread类来实现多线程:
当我们自定义的类继承Thread类后,该类就为一个线程类,该类为一个独立的执行单元,线程代码必须编写在run()方法中,run方法是由Thread类定义,我们自己写的线程类必须重写run方法。
run方法中定义的代码为线程代码,但run方法不能直接调用,如果直接调用并没有开启新的线程而是将run方法交给调用的线程执行
要开启新的线程需要调用Thread类的start()方法,该方法自动开启一个新的线程并自动执行run方法中的内容
结果:
java多线程的启动顺序不一定是线程执行的顺序,各个线程之间是抢占CPU资源执行的,所有有可能出现与启动顺序不一致的情况。
CPU的调用策略:
如何使用CPU资源是由操作系统来决定的,但操作系统只能决定CPU的使用策略不能控制实际获得CPU执行权的程序。
线程执行有两种方式:
1.抢占式:
目前PC机中使用最多的一种方式,线程抢占CPU的执行权,当一个线程抢到CPU的资源后并不是一直执行到此线程执行结束,而是执行一个时间片后让出CPU资源,此时同其他线程再次抢占CPU资源获得执行权。
2.轮循式;
每个线程执行固定的时间片后让出CPU资源,以此循环执行每个线程执行相同的时间片后让出CPU资源交给下一个线程执行。
希望对您有所帮助!~