Java学习之初识线程
“身之主宰便是心,心之所发便是意,意之本体便是知,意之所在便是物 --摘自阳明先生语录”
1、概念
在说线程之前我们先了解关于进程的一些知识,什么是进程?
程序一旦运行就是一个独立的进程,以windows为例,打开windows任务管理器,在应用程序栏中就是一个个的进程,进程可以看做是程序执行的一个实例。
每个进程都有独立的代码和数据空间,进程间的切换会有较大的开销,一个进程包含1至n个线程。 再说说什么是线程?
线程是一个比进程粒度更小的执行单位,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。每个程序里至少有一个线程(主线程,也叫入口线程,只能有一个)。
2、线程的使用方法
在Java中线程的实现方式有三种 实现Runnable接口、继承Thread类、实现Callable接口,后两者都跟Runnable有关,本文只讲解前两种,后面会有单独的文章来说Callable。
实现Runnable接口方式如下:
public class Test implements Runnable{
@Override
public void run() {
System.out.println("线程启动,开始执行......");
}
public static void main(String[] args) {
Test test = new Test();
Thread thread = new Thread(test);
thread.start();
}
}
运行上面的代码将打印:线程启动,开始执行......
Runnable接口只有一个run方法,该方法是在线程启动后执行的方法,使用Runnable的方式无法直接使线程处于就绪状态,你必须通过创建Thread实例来创建新的线程。
继承Thread类方式如下:
public class Test extends Thread{
@Override
public void run() {
System.out.println("线程启动,开始执行......");
}
public static void main(String[] args) {
Test test = new Test();
test.start();
}
}
Thread类其实也实现了Runable接口,如果用Thread,重写run方法后就可以直接启动线程了。
调用Thread类的start方法后,线程不会立马执行,这只是使该线程处于就绪状态,处于就绪状态的线程会等待计算机分配CPU执行,也就是说具体线程什么时候执行得由计算机来决定。
PS:不能直接调用run方法,如果调用run方法那么只会当作一次普通的方法调用而已。
不能重复调用start方法:
public class Test extends Thread{
@Override
public void run() {
System.out.println("线程启动,开始执行......");
}
public static void main(String[] args) {
Test test = new Test();
test.start();
test.start();
}
}
这段代码里连续调用了两次start方法,在执行到第二次start方法调用时将报java.lang.IllegalThreadStateException异常,该异常表示一个Thread不能重复调用start方法 。
3、生命周期
一个线程的生命周期分为五种,它要经过新建、就绪、运行、阻塞和死亡5种状态。
新建:使用new关键字创建了一个线程之后,该线程就处于新建状态。
就绪:调用了start()方法之后,该线程处于就绪状态。
运行:只有就绪状态下的线程才能获得计算机分配的CPU,开始执行run()方法,则该线程处于运行状态。
阻塞:阻塞状态是线程因为某种原因放弃CPU使用权,失去所占用资源之后,暂时停止运行。
死亡:当线程执行完run方法或者发生异常退出,线程结束生命周期。PS:调用该线程stop()方法来结束该线程——该方法容易导致死锁,不推荐使用,JDK已废弃
阻塞状态分为三种情况:
等待阻塞:调用wait方法暂停执行,并且放弃已经获得的锁,进入等待状态。
同步阻塞:获取对象的同步锁时,如果同步锁被其他的线程占用,则JVM会把该线程放入锁池中。
其他阻塞:如执行了sleep(睡眠)方法,或等待I/O设备等资源,将让出CPU并暂时停止自己的运行,进入 阻塞状态。
注意:进入阻塞状态的线程,当接触阻塞状态后将重新进入到就绪状态,而不是马上运行。
4、常用方法
start() :调用该方法使线程进入就绪状态
run():获得CPU执行的线程将运行该方法
sleep():这是一个静态方法,通过Thread.sleep()调用,调用该方法放弃CPU资源,使线程休眠一段时间,该方法的参数为毫秒
join():等待该线程终止,也就是说该线程是指的主线程等待子线程的终止,在子线程调用了join()方法后面的代码,只有等到子线程结束了才能执行
yield():暂停当前正在执行的线程对象,并执行其他线程
wait:调用该方法后线程将进入等待状态,只有等待另外线程的通知或被中断才会返回,需要注意的是调用wait()方法后,会释放对象的锁
notify():通知一个线程继续运行
notifyAll:通知所有线程继续运行
5、总结郑州不孕不育好医院:http://www.zzchyy110.com/
1、使用Runnable接口可以避免Java中单继承的限制(推荐实现Runnable接口)
2、使用Runnable接口需要另外创建Thread实例来创建新的线程
3、不能直接调用run方法,否则将作为一次普通的方法调用
4、不能连续调用start方法
---------------------
Java学习之初识线程的更多相关文章
- java学习笔记15--多线程编程基础2
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...
- java学习笔记14--多线程编程基础1
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...
- 【转】Java学习---深入理解线程池
[原文]https://www.toutiao.com/i6566022142666736131/ 我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很 ...
- java学习笔记之线程(Thread)
刚开始接触java多线程的时候,我觉得,应该像其他章节的内容一样,了解了生命周期.构造方法.方法.属性.使用的条件,就可以结束了,然而随着我的深入学习了解,我发现java的多线程是java的一个特别重 ...
- 0041 Java学习笔记-多线程-线程池、ForkJoinPool、ThreadLocal
什么是线程池 创建线程,因为涉及到跟操作系统交互,比较耗费资源.如果要创建大量的线程,而每个线程的生存期又很短,这时候就应该使用线程池了,就像数据库的连接池一样,预先开启一定数量的线程,有任务了就将任 ...
- 0040 Java学习笔记-多线程-线程run()方法中的异常
run()与异常 不管是Threade还是Runnable的run()方法都没有定义抛出异常,也就是说一条线程内部发生的checked异常,必须也只能在内部用try-catch处理掉,不能往外抛,因为 ...
- 0039 Java学习笔记-多线程-线程控制、线程组
join线程 假如A线程要B线程去完成一项任务,在B线程完成返回之前,不进行下一步执行,那么就可以调用B线程的join()方法 join()方法的重载: join():等待不限时间 join(long ...
- Java学习-002-Java初识
此文主要讲述什么是 Java,以及 Java 常识性知识,方便亲们进一步了解 Java 语言相关的常识. 一.Java 概述 Java 语言是美国 Sun Microsystems 公司于 1995 ...
- java学习之路---线程(重点)
1.多线程是一种并发机制的有效手段.进程和线程一样,都是实现并发的一个基本单位.线程是比进程更小的一种实现单位,线程是在进程的基础上的进一步划分.所谓的多线就是在一个进程中产生了多个线程,这些线程可 ...
随机推荐
- 利用python数据分析panda学习笔记之Series
1 Series a:类似一维数组的对象,每一个数据与之相关的数据标签组成 b:生成的左边为索引,不指定则默认从0开始. from pandas import Series,DataFrame imp ...
- Flutter实战视频-移动电商-25.列表页_使用Provide控制子类-1
25.列表页_使用Provide控制子类-1 主要是二级分类的UI布局 1分15秒 生成我们的右侧动态类 定义list变量 开始写里面的子项,把每一个小的写了 再拼成一个大的 这样我们的小类就写完了 ...
- 为什么用思科里面的设备第一次ping的时候总会丢一个包呢?
大家搞计算机的不用讲,肯定都玩过网络吧? 比如一些思科,华为,华三这些模拟器,你们总会当你第一次用某个设备去ping某个设备的时候第一包总会被丢弃. 但我相信很多人都不知道为啥 会丢弃. 今天小 ...
- Nginx的安装配置和tomcat负载均衡
Nginx简介 什么是nginx? Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器.由俄罗斯的程序设计师Igor Sysoev所开发,官方测试ngi ...
- __doPostBack方法解析 __VIEWSTATE __EVENTTARGET __doPostBack __EVENTARGUMENT
关于这个的另一篇博客:http://www.cnblogs.com/Silicon-Fado/archive/2009/04/21/1440437.html __VIEWSTATE:页面状态信息在客户 ...
- https协议(4)
架构层次 HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版.即HTT ...
- SPOJ PHT【二分】+SPOJ INUM【最小/大值重复】
BC 两道其实都是水 没有完整地想好直接就码出事情.wa了一次以后要找bug,找完要把思路理的非常清楚 SPOJ PHT[二分] #include<bits/stdc++.h> using ...
- lightoj 1078【同余定理】
题意: 给你一个n和一个数 digit ,问你最少需要多少个 digit 使得整除于n; 思路: 同余定理(a+b)%n=(a%n+b%n)%n; (m%n+m%n*10+m%n*100+m%n*10 ...
- HDU1597【二分瞎搞】
题意: 求第n个数: 思路: 可以看到一种序列: 1 12 123 1234 12345 123456 1234567 12345678 123456789 1234567891 1234567891 ...
- P5135 painting(组合数)
传送门 如果\(op==1\),那么每一个方案都可以看做从\(n\)个数里选出\(m\)个数,然后\(sort\)一下依次放到每列,方案数就是\({n\choose m}\).因为\(n\)很大,但是 ...