JAVA多线程-初体验
一、线程和进程
每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。
进程是所有线程的集合,每一个线程是进程中的一条执行路径。
二、为什么使用多线程,哪些场景下使用
多线程的好处是提高程序的效率。
主要能体现到多线程提高程序效率。如:迅雷多线程下载、分批发送短信等。。。。
三、多线程创建方式
1)继承Thread类,重写run方法
public class ThreadDemos extends Thread {
public void run() {
2) 实现Runnable接口,重写run方法
public class RunnableDemo implements Runnable {
public void run() {
3) 使用匿名内部类方式
Thread thread = new Thread(new Runnable() {
public void run() {
//TODO
}
});
四、线程启动方式
开始执行线程是不是调用run方法,而是start方法。调用run方法是使用实例调用方法,不是线程启动。
而实现Runnable接口的方法,需要new Thread(new
RunnableDemo()).start()。
五、多线程生命周期
线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。
1)新建状态
当用new操作符创建一个线程时,例如new Thread(r),线程还没有开始运行,此时线程处在新建状态。当一个线程处于新生状态时,程序还没有开始运行线程中的代码。
2)就绪状态
一个新创建的线程并不自动开始运行,要执行线程,必须调用线程的start()方法。当线程对象调用start()方法即启动了线程,start()方法创建线程运行的系统资源,并调度线程运行run()方法。当start()方法返回后,线程就处于就绪状态。
处于就绪状态的线程并不一定立即运行run()方法,线程还必须同其他线程竞争CPU时间,只有获得CPU时间才可以运行线程。因为在单CPU的计算机系统中,不可能同时运行多个线程,一个时刻仅有一个线程处于运行状态。因此此时可能有多个线程处于就绪状态。对多个处于就绪状态的线程是由Java运行时系统的线程调度程序(thread scheduler)来调度的。
3)运行状态
当线程获得CPU时间后,它才进入运行状态,真正开始执行run()方法。
4)阻塞状态
线程运行过程中,可能由于各种原因进入阻塞状态:
1>线程通过调用sleep方法进入睡眠状态;
2>线程调用一个在I/O上被阻塞的操作,即该操作在输入输出操作完成之前不会返回到它的调用者;
3>线程试图得到一个锁,而该锁正被其他线程持有;
4>线程在等待某个触发条件。
5)死亡状态
有两个原因会导致线程死亡:
1) run方法正常退出而自然死亡,
2) 一个未捕获的异常终止了run方法而使线程猝死。
为了确定线程在当前是否存活着(就是要么是可运行的,要么是被阻塞了),需要使用isAlive方法。如果是可运行或被阻塞,这个方法返回true;如果线程仍旧是new状态且不是可运行的,或者线程死亡了,则返回false。
常用线程api方法 |
|
start() |
启动线程 |
currentThread() |
获取当前线程对象 |
getID() |
获取当前线程IDThread-编号 该编号从0开始 |
getName()/setName() |
获取当前线程名称/设置线程名称 |
sleep(long mill) |
休眠线程 |
stop() |
停止线程 |
常用线程构造函数 |
|
new Thread() |
分配一个新的 Thread对象 |
new Thread(String name) |
分配一个新的 Thread对象,具有指定的 name正如其名。 |
new Thread(Runable r) |
分配一个新的 Thread对象 |
new Thread(Runable r, String name) |
分配一个新的 Thread对象 |
六、思考点
1).进程与线程的区别?
答:进程是所有线程的集合,每一个线程是进程中的一条执行路径,线程只是一条执行路径。
2).为什么要用多线程?
答:提高程序效率
3).多线程创建方式与启动子线程方法?
答:继承Thread或实现Runnable 接口。Thread直接利用构造出来的对象调用start()方法。Runnable因为没有继承Thread类,无法调用start方法,需要new Thread(new RunnableDemo()),再调用start方法。
4).是继承Thread类好还是实现Runnable接口好?
答:Runnable接口好,因为实现了接口还可以继续继承。继承Thread类不能再继承。
5).你在哪里用到了多线程?
答:主要能体现到多线程提高程序效率。
举例:迅雷多线程下载等。
JAVA多线程-初体验的更多相关文章
- JAVA 11初体验
JAVA 11初体验 随着JAVA没半年发布一次新版本,前几天JAVA 11隆重登场.在JAVA 11中,增加了一些新的特性和api, 同时也删除了一些特性和api,还有一些性能和垃圾回收的改进. 作 ...
- java的多线程初体验
这里以车站售票作为模拟场景,多个票务人员同时出售某一列高铁(G250?)的车票,售票的基本保证有2点: 1.不能售出多于预定限额的车票. 2.不能售出具有相同座位的车票. 初学java,有不当的地方各 ...
- Java爬虫初体验
年关将近,工作上该完成的都差不多了,上午闲着就接触学习了一下爬虫,抽空还把正则表达式复习了,Java的Regex和JS上还是有区别的,JS上的"\w"Java得写成"\\ ...
- Java集合初体验
背景: 因为对Java的集合完全不了解,所以才在网上找了找能形成初步印象的文章进行学习,大多涉及的是一些概念和基础知识. 一.数组array和集合的区别: (1)数组是大小固定的,并且同 ...
- java学习初体验之课后习题
import java.util.Scanner; public class HelloWorld { public static void main(String[] args) { //打印Hel ...
- Java单元测试初体验(JUnit4)
什么是单元测试 我们在编写大型程序的时候,需要写成千上万个方法或函数,这些函数的功能可能很强大,但我们在程序中只用到该函数的一小部分功能,并且经过调试可以确定,这一小部分功能是正确的.但是,我们同时应 ...
- java activemq初体验
1.下载安装ActiveMQ ActiveMQ官网下载地址:http://activemq.apache.org/download.html ActiveMQ 提供了Windows 和Linux.Un ...
- java学习初体验NO.1
一.学习目标: 1.理解Java编译原理 在Java编程语言中,所以源代码首先以用.Java扩展名结尾的纯文本件编写,然后,编译器将这些源文件编译成.Class文件.然后,Java启动器工具使用Jav ...
- java程序初体验
示例代码 class Demo { public static void main(String[] args) { System.out.print("hello world") ...
随机推荐
- 【转】Js正则表达式
//校验是否全由数字组成 var patrn=/^[0-9]{1,20}$/ //校验登录名:只能输入5-20个以字母开头.可带数字.“_”.“.”的字串 var patrn=/^[a-zA-Z]{1 ...
- Laravel5多图上传和Laravel5单图上传的功能实现
Laravel5文件上传默认只能上传一张图片,但是有的时候我们需要一次性上传多图就不行了,我在网上看了很多关于laravel5图片上传的文章,很多都只是介绍laravel5单图上传,多图片上传介绍少之 ...
- 参观微软Serbia开发中心和Office365 2019-01-31活动感悟
这是<国外线下技术俱乐部建设>系列文章之一. 该活动网址是:https://www.meetup.com/ITPro-Serbia/events/258352104/ 活动内容是讲Of ...
- web前端自动化测试/爬虫利器puppeteer介绍
web前端自动化测试/爬虫利器puppeteer介绍 Intro Chrome59(linux.macos). Chrome60(windows)之后,Chrome自带headless(无界面)模式很 ...
- 测者的性能测试手册:Yourkit 监控JettyYourkit 监控Jetty
Yourkit是收费工具,每一个email可以免费试用15天,觉得好的朋友可以自行选择购买 服务器端下载yourkit(java) Windows安装yourkit Java Profiler 201 ...
- MySQL 基础知识梳理学习(三)----InnoDB日志相关的几个要点
1.InnoDB的特点 :(1)Fully ACID (InnoDB默认的Repeat Read隔离级别支持):(2)Row-level Locking(支持行锁):(3)Multi-version ...
- Jenkins系统监测(转)
Jenkins系统监测 Jenkins 是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上.同时 Jenkins 能实施监控集成中存在 ...
- Saltstack_使用指南07_远程执行-执行模块
1. 主机规划 远程执行教程文档 https://docs.saltstack.com/en/latest/topics/tutorials/modules.html 所有模块文档 https://d ...
- 【Python 24】52周存钱挑战4.0(函数)
1.案例描述 按照52周存钱法,存钱人必须在一年52周内,每周递存10元.例如,第一周存10元,第二周存20元,第三周存30元,直到第52周存520元. 记录52周后能存多少钱?即10+20+30+. ...
- Starting sshd: /var/empty/sshd must be owned by root and not group or world-writable.
Starting sshd: /var/empty/sshd must be owned by root and not group or world-writable. [FAILED] ...