Java基础总结之多线程(1)

不得不说,多线程很可能是Java基础中最难的一部分,比对象众多的IO流难,比要理解到位的反射难.难在哪?难在严谨的逻辑上.,而逻辑是看不见摸不到的,却又偏偏会影响最后的输出结果.在多线程这里,由于执行线程的随机性,输出结果还可能是不确定的,是随机变化的.坦白讲,自己写程序时还好,但对着结果去探究自己的程序到底定义了怎样的逻辑时,的确很烧脑.哎,智商是硬伤啊!
不多说废话了,把我关于多线程的总结说给大家.
当然这里还是强调下,我的总结是基于自学视频的:高手们可以绕道,我这里没有那些比较高级的东西,例如线程池、阻塞栈之类的,全是基础的东西;想看知识点罗列笔记的也不用浪费时间了,已经有很多好心人在网页上分享了,你可以去找找.
Java中多线程的基础是线程的五个状态,在我看来,这五个状态是多线程的核心和关键.掌握了线程的这五个状态是如何产生转化的,你就能很好理解多线程的进行为什么会有这样那样的过程和结果了.见下图
这里写图片描述
在详细分析这五个状态前,先把在多线程常用到的几个类和方法概述下,要注意这些方法是属于谁的,这样就知道这五个状态转化时是哪个对象或者类会影响到了。
1.Runnable接口:应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为 run 的无参数方法。
2.Thread类:程序中的执行线程。
⑴构造函数:常用的有一个。
Thread(Runnable target,String name):第一个参数是实现了Runnable接口的类的对象,产生的Thread类对象调用start()时会执行其run();第二个参数是给产生的Thread类对象设置名字。
两个参数可以只有任意一个或都没有的重载函数都是存在的,看需要选择。
⑵一些静态方法,即用 Thread.方法 的方式调用。
①static Thread currentThread():返回对当前正在执行的线程对象的引用。
②static void sleep(long millis):在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。该线程不丢失任何监视器的所属权,即仍保有锁。
③static void yield():暂停当前正在执行的线程对象,并执行其他线程。
⑶一些非静态方法,即用Thread类对象.方法 的方式调用
①String getName():返回该线程的名称。
②void interrupt():中断线程
③void join():等待该线程终止
④void run():如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。Thread 的子类应该重写该方法。
⑤void setDaemon(boolen on):on为true时,将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。 该方法必须在启动线程前调用。
⑥void start():使该线程开始执行;Java 虚拟机调用该线程的 run 方法。 多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。
⑦String toString():返回该线程的字符串表示形式,包括线程名称、优先级和线程组。
3.Object类:对,没看错,就是上帝!
主要是涉及到线程同步用的锁的几个方法
①final void wait():在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。当前线程必须拥有一个对象监视器(锁),调用此方法后会释放锁。
② final void notify():唤醒在此对象监视器上等待的单个线程,当有多个等待线程时,选择是随机的。
final void notifyAll():唤醒在此对象监视器上等待的所有线程。
接下来是关于五个状态的分析说明:
1.产生:即线程被在写在代码中了,但并未被调用。
产生的方式有两种:简单讲就是实现Runnable接口和继承Thread类。两种方式的不同(就是run在哪里)优劣要知道,面试时可能会被问。用实现方式会更好,因为避免了单继承的局限性,同时可以实现数据的共享操作。
2.可运行:这个状态是个临时过渡状态,是有运行资格但没执行权。这是由于计算机CPU虽然是多线程设计的,但在某个时间点,它实际只运行一个程序(现在的多核CPU可以同时多个,但具体每个CPU还是只能一个)。这样,被调用了start()也好,从冻结状态苏醒也好,都有可能在第一时间不能马上被执行,而是要在队列里等待。这个状态何时开始和结束是很难确定的(CPU运行规则我们很难知道),正因如此才造成了多线程运行时可能会出现的情况有多种。
3.运行:可以说是核心状态,和其他四个状态全部相关。拥有执行权的大佬。
4.冻结:失去执行权但线程却未结束。这个状态是调节多线程运行分布的重要方式。
5.消亡:即run方法结束,线程代码执行完毕。
基础的关键说完,下面开始多线程及其安全问题的解决了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值