JAVA学习笔记(一):线程

1. 进程与线程
进程是程序在一个数据集合上运行的过程,是系统进行资源分配的最小单位。其对于程序而言是动态概念, 一个程序可以对应多个进程;一个进程可以包括多个程序。进程可以创建进程。进程的组成包括程序、数据和PCB。
通常一个进程应该至少有三种状态:就绪状态、执行状态、阻塞状态。 大部分系统中进程还具有创建状态、结束状态,且就绪与阻塞状态下的进程可以被挂起。
而线程是进程内一个相对独立的、可调度的执行单元,是CPU调度的最小单位。一个进程可以拥有多个线程,线程只拥有一点在运行时必不可少的资源,但它可以与同属一个进程的其他线程共享进程拥有的全部资源。 和进程类似,线程也有运行、就绪、阻塞等状态。线程具有用户级线程和内核级线程的区别,操作系统通常会采取不同策略将用户级线程映射到内核级线程以实现对多线程的支持。
2.Thread类
Thread的常见构造方法:
- Thread(String name):继承Thread类并重写run()方法创建线程
- Thread(Runnable target):通过实现Runnable接口并重写run()方法的target类作为参数创建线程
- Thread(()->{}):通过lambda表达式创建线程
Thread常见属性:ID、name、state、priority、interrupted,均可以用get方法或者is方法获取。
Thread常见方法:
- start():启动线程的方法,调用该方法会使线程进入就绪状态,等待CPU分配时间片后开始执行。
- run():线程的执行体,包含了线程要执行的代码,由系统自动调用,用户主动调用并不会创建线程。
- interrupt():将isInterrupted()的标志位设置为true,并强行结束阻塞状态,并不会实际上结束线程。
- join():调用该方法将使调用该方法的进程阻塞,直到被调用方法的进程结束后,才能回到就绪状态等待CPU分配时间片后执行。
- sleep(long millis) throws InterruptedException:该方法为Thread类的静态方法,参数为线程休眠的毫秒数。
- currentThread():返回现在正在执行的线程。
- yield():该方法为Thread类的静态方法,作用为使当前线程让出CPU资源回到就绪状态。
线程的状态:
- NEW:创建了一个线程对象。
- RUNNABLE:线程就绪或线程正在执行。
- TIMED_WAITING:线程在有限时地等待唤醒,如sleep()。
- WAITING:线程在无限时地等待唤醒,如锁调用wait()方法。
- BLOCKED:线程被阻塞,在等待获取锁。
- TERMINATED:线程终止。
3.线程安全
synchronized关键字:线程安全的原子性
- synchronized(lock){}:代码块中的内容即为被对象lock加锁的代码块,当A进程执行该代码块时,没有获得锁的B进程则阻塞,直到A进程执行结束后才有机会参与lock锁对象的竞争。
- synchronized修饰成员方法:相当于以this作为锁对象。
volatile关键字:线程安全的内存可见性和有序性
- volatile修饰变量:强制使变量由内存中读取,避免编译器优化。
- volatile修饰对象:强制使对象实例化时按照先调用构造方法再传递给引用变量的顺序,避免编译器优化。
e.g.单例模式的线程安全问题(原子性、有序性)
4.简单的进程同步与互斥
wait()方法:用于synchronized代码块中锁对象的方法,其作用为释放锁,并使该线程阻塞等待(进入WAITING状态)。
notify()方法:用于synchronized代码块中锁对象的方法,其作用为随机唤醒一个因该锁对象的wait()方法阻塞等待的线程。
notifyAll()方法:作用为唤醒所有因该锁对象的wait()方法阻塞等待的线程,唤醒后的线程会重新竞争锁。
例题:
编写一个可以从 1 到 n 输出代表这个数字的字符串的程序,但是:
- 如果这个数字可以被 3 整除,输出 "fizz"。
- 如果这个数字可以被 5 整除,输出 "buzz"。
- 如果这个数字可以同时被 3 和 5 整除,输出 "fizzbuzz"。
例如,当 n = 15,输出: 1, 2, fizz, 4, buzz, fizz, 7, 8, fizz, buzz, 11, fizz, 13, 14, fizzbuzz。

本文使用BiliBili-Markdown油猴脚本实现在b站专栏投稿中使用Markdown语法。
作者:生命不详的Citatsu
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/1472.html