(Java多线程系列一)快速入门
Java多线程快速入门
1、线程和进程的区别
进程是所有线程的集合,每一个线程是进程的一条执行路径。
2、多线程的应用场景
多线程主要体现在提高程序的效率,比如迅雷多线程下载,多线程分批发送短信等。
3、多线程的创建方式
(1)继承Thread类,重写run()方法
class ThreadDemo extends Thread {
@Override
public void run() {
System.out.println("这里是子线程");
System.out.println("线程名称:" + this.getName());
System.out.println("线程ID:" + this.getId());
}
}
public class JavaThreadDemo01 {
public static void main(String[] args) {
System.out.println("这里是主线程");
ThreadDemo threadDemo = new ThreadDemo();
threadDemo.start();
}
}
(2)实现Runnable接口,重写run()方法
class RunnableDemo implements Runnable {
@Override
public void run() {
System.out.println("这里是子线程");
System.out.println("线程名称:" + Thread.currentThread().getName());
System.out.println("线程ID:" + Thread.currentThread().getId());
}
}
public class JavaThreadDemo02 {
public static void main(String[] args) {
System.out.println("这里是主线程");
RunnableDemo runnableDemo = new RunnableDemo();
Thread thread = new Thread(runnableDemo);
thread.start();
}
}
(3)使用匿名内部类方式
public class JavaThreadDemo03 {
public static void main(String[] args) {
System.out.println("主线程");
// 使用实现接口的方式
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("这里是子线程");
System.out.println("线程名称:" + Thread.currentThread().getName());
System.out.println("线程ID:" + Thread.currentThread().getId());
}
});
thread1.start();
// 使用lambda表达式
Thread thread2 = new Thread(() -> {
System.out.println("这里是子线程");
System.out.println("线程名称:" + Thread.currentThread().getName());
System.out.println("线程ID:" + Thread.currentThread().getId());
});
thread2.start();
}
}
(4)使用继承Thread类还是使用实现Runnable接口的方式新建线程好?
使用实现Runnable接口的方式好,因为java是单继承,所以继承Thread接口后不能继承其他父类,而实现Runnable接口后还可以实现其他接口,继承其他父类。
(5)启动线程调用start()方法还是run()方法?
调用run()方法是使用实例调用,是单线程调用,不会开启多线程。
4、多线程运行状态
①新建状态(NEW):新建一个线程,线程还没有开始运行,此时线程就是新建状态
②就绪状态:当线程对象调用了start()方法即启动了线程,start()方法创建线程运行的系统资源,并调度线程运行run()方法。当start()方法返回后,线程就处于就绪状态。处于就绪状态的线程并不一定立即运行run()方法,线程还必须同其他线程竞争cpu时间,只有获得cpu时间才能运行线程。因为在单cpu的计算机系统中,不可能同时运行多个线程,一个时刻仅能有一个线程处于运行状态,因此可能存在多个处于就绪状态的线程,对于多个就绪状态的线程是由Java运行时系统的线程调度程序来调度的。
③运行状态(RUNNABLE):当线程获取cpu时间后,线程进入运行状态,真正开始执行run()方法。
④阻塞状态(BLOCKED/WAITING/TIMED_WAITING):a、线程通过调用sleep()方法进入睡眠;b、线程调用一个在I\O上被阻塞的操作;c、线程试图得到一个锁,而该锁正被其他线程持有;d、线程在等待某个触发条件。
BLOCKED:等待监视器锁,实际上就是被synchronized方法或块阻塞
WAITING:等待用notify()或者notifyAll()唤醒
TIMED_WAITING:等待用notify()或者notifyAll()唤醒,如果没有等到,时间到了也会退出这一状态
⑤死亡状态(TERMINATED):a、run()方法正常退出自然死亡;b、一个未捕获的异常终止了run()方法使线程猝死。
5、判断线程的存活状态
①调用isAlive()方法,如果是可运行或被阻塞,方法返回true。
②线程是新建状态或线程死亡,返回false。
(Java多线程系列一)快速入门的更多相关文章
- Java多线程系列——从菜鸟到入门
持续更新系列. 参考自Java多线程系列目录(共43篇).<Java并发编程实战>.<实战Java高并发程序设计>.<Java并发编程的艺术>. 基础 Java多线 ...
- Java多线程系列--“JUC锁”03之 公平锁(一)
概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...
- Java多线程系列--“JUC锁”04之 公平锁(二)
概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...
- Java多线程系列--“JUC锁”10之 CyclicBarrier原理和示例
概要 本章介绍JUC包中的CyclicBarrier锁.内容包括:CyclicBarrier简介CyclicBarrier数据结构CyclicBarrier源码分析(基于JDK1.7.0_40)Cyc ...
- Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock
本章对ReentrantLock包进行基本介绍,这一章主要对ReentrantLock进行概括性的介绍,内容包括:ReentrantLock介绍ReentrantLock函数列表ReentrantLo ...
- Java多线程系列--“JUC锁”01之 框架
本章,我们介绍锁的架构:后面的章节将会对它们逐个进行分析介绍.目录如下:01. Java多线程系列--“JUC锁”01之 框架02. Java多线程系列--“JUC锁”02之 互斥锁Reentrant ...
- Java多线程系列目录(共43篇)
最近,在研究Java多线程的内容目录,将其内容逐步整理并发布. (一) 基础篇 01. Java多线程系列--“基础篇”01之 基本概念 02. Java多线程系列--“基础篇”02之 常用的实现多线 ...
- Java多线程系列--“JUC线程池”06之 Callable和Future
概要 本章介绍线程池中的Callable和Future.Callable 和 Future 简介示例和源码分析(基于JDK1.7.0_40) 转载请注明出处:http://www.cnblogs.co ...
- Java多线程系列--“JUC锁”09之 CountDownLatch原理和示例
概要 前面对"独占锁"和"共享锁"有了个大致的了解:本章,我们对CountDownLatch进行学习.和ReadWriteLock.ReadLock一样,Cou ...
- Java多线程系列--“JUC锁”06之 Condition条件
概要 前面对JUC包中的锁的原理进行了介绍,本章会JUC中对与锁经常配合使用的Condition进行介绍,内容包括:Condition介绍Condition函数列表Condition示例转载请注明出处 ...
随机推荐
- python之cookies
#cookies保存在文档头的内部,将cookies信息保存在文档中 userinfo={'} r=requests.get('http://httpbin.org/get',cookies=user ...
- centos7安装activemq5.15
1. 官网下载 http://activemq.apache.org/components/classic/download/ 上传到服务器 2. 安装 tar zxf apache-activemq ...
- python之函数、面向对象
学习python到了函数这一块进度有所放缓,主要还是想理解透彻,毕竟直觉告诉我函数是python是其中的关键,不管是模块.还是包.或者是库,都是建立在若干个函数定义上面. 章节后面就是关于面向对象编程 ...
- 移除django的旧版本
移除django的旧版本 下面这一段代码打进去绝对能看到你想要的,根据这个路径去找版本文件夹,他的名字应该是django.2xx.xxx很长一段,请你删了它! import django import ...
- TCP/IP 协议是如何保证数据可靠性的?
原文: 网络基础:TCP协议-如何保证传输可靠性 TCP协议传输的特点主要就是面向字节流.传输可靠.面向连接.这篇博客,我们就重点讨论一下TCP协议如何确保传输的可靠性的. 确保传输可靠性的方式TCP ...
- 解决 mysql (10038)
1.授权 mysql>grant all privileges on *.* to 'root'@'%' identified by 'youpassword' with grant o ...
- git删除已经push的远程文件或文件夹
在使用git提交项目时,有时候会误提交一下文件,比如:*.iml,*.project,*.settings,.idea/*等文件,有时候这些不需要提交的文件可以加入到.gitignore,在提交的时候 ...
- Dubbo架构
原文链接http://dubbo.apache.org 架构图 节点角色说明 节点 角色说明 Provider 暴露服务的服务提供方 Consumer 调用远程服务的服务消费方 Registry 服务 ...
- C数据结构排序算法——希尔排序法用法总结(转http://www.cnblogs.com/skywang12345/p/3597597.html)
希尔排序介绍 希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进.该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 希尔排序实质上是一种分组插入方法.它 ...
- 笔记本电脑重装win7/win10系统教程
由于笔记本第一次重装系统会出现系统装不上,还有出现找不到有效硬盘分区,等等问题,然后这篇文章主要讲解BIOS设置的方法,用此BIOS设置,电脑用原本安装系统的方式,能有效地解决以上问题,这有两种方法解 ...