线程与进程

计算机中有多个独立运行的任务,每个任务对应着一个进程,每个进程又可以产生多个线程

进程:

程序的一次动态执行过程,应用程序的执行实例,一个应用有可能有多个进程,有独立的内存空间和系统资源

进程的特点:

1.进程是系统运行的基本单位
2.每一个进程都有一块独立的内存空间,一组系统资源
3.每一个进程的内部数据和状态都是完全独立的

线程:

CPU调度和分配的基本单位,线程中执行运算的最小单位,可完成一个独立的控制流程,一个进程至少有一个线程

多线程:

1,在程序中同时运行了多个线程,用来完成不同的工作,则称之为”多线程”
2,多个线程交替占用CPU的资源,而非真正的并行执行

多线程的好处:

1.充分利用CPU资源
2.简化编程模型
3.带来良好的用户体验

主线程:

特点:
1.main方法即为主线程的入口
2.产生其他子线程的进程
3.总是在程序的最后执行,因为他执行各种关闭动作

子线程:

1.run方法里面的内容就是子线程的 工作任务
2.run方法就是子线程在执行,main方法就是main线程在执行
3.子线程是由main方法创建出来的

创建方式:

继承Thread类:
特点:
1.编写简单
2.适用于单继承
实现Runnable接口:
特点:
1.避免单继承的局限性
2.便于共享资源

线程的状态:

线程的生命周期可以分为4个阶段,及线程的4种状态,分别为新生状态,可运行状态,阻塞状态和死亡状态
image.png

Thread类

Thread类支持多线程编程
Thread类常用方法:

方法 说明
void run() 执行任务操作的方法
void start() 使该线程开始执行
void sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)
string getname() 返回该线程的名称
int getPriority() 返回线程的优先级
void setPriority(int newPriority) 更改线程的优先级
Thread.State getState() 返回该线程的状态
Boolean isAlive() 测试线程是否处于活动状态
void join() 等待该线程终止
void interrupt() 中断线程
void yield() 暂停当前正在执行的线程对象,并执行其他线程

线程的调度

线程的优先级

线程的优先级用1~10表示,10最高,1最低,默认为5,每个优先级对应Thread类的公用静态常量
默认:public static final int NORM_PRIORITY=5 ;
最低:public static final int MIN_PRIORITY=1 ;
最高:public static final int MAX_PRIORITY=10 ;
线程的优先级用setpriority()方法更改

实现线程调度的方法

1.join()方法:使当前线程暂停执行,等待调用该方法的线程结束后再继续执行本线程
2.sleep()方法:使当前线程睡眠(停止执行)millis毫秒,线程有运行中状态进入不可运行状态,睡眠时间过后会再次进入可运行状态
3.yield()方法:让当前线程暂停执行,允许其他线程执行,但该线程仍处于不可运行状态,但不变成阻塞状态,此时系统选择其他相同或优先级更高的优先级的线程执行,若无其他相同或其他优先级跟更高的线程,则该线程继续执行

sleep方法和yield方法的区别:

sleep方法 yield方法
使线程进入阻塞状态 将当前线程转入暂停执行的状态
即使没有其他等待运行的线程,当前线程也会等待指定的时间 如果没有其他等待执行的线程,当前线程会马上恢复执行
其他等待执行的线程的机会是均等的 会运行优先级相同或更高的线程

线程的同步

方法一:同步代码块 synchronized (this)
使用:将需要锁定的代码放到synchronized代码块中
特点:
1.同一时刻自能有一个线程进入 synchronized (this)中
2.当一个线程访问一个 synchronized (this)同步代码块时,其他 synchronized (this)同步代码块也同样被锁定
3.当一个线程访问 synchronized (this)同步代码块时,其他线程可以访问该资源的非同步代码

  1. public class Test2_1 implements Runnable {
  2. int count=100;
  3. int num;
  4. @Override
  5. public void run() {
  6. while (true){
  7. synchronized (this){
  8. if (count==0){
  9. break;
  10. }
  11. count--;
  12. num++;
  13. System.out.println(Thread.currentThread().getName()+"抢到了第"+num+"张票,还剩"+count+"张票!");
  14. try {
  15. Thread.sleep(500);
  16. } catch (InterruptedException e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. }
  21. }
  22. }

方法二:同步方法(用 synchronized 关键字修饰的方法)

  1. public class Test3_1 implements Runnable {
  2. int count = 100;
  3. int num;
  4. @Override
  5. public void run() {
  6. while (sale()) {
  7. }
  8. }
  9. public synchronized boolean sale() {
  10. if (count == 0) {
  11. return false;
  12. }
  13. count--;
  14. num++;
  15. try {
  16. Thread.sleep(10);
  17. } catch (InterruptedException e) {
  18. e.printStackTrace();
  19. }
  20. System.out.println(Thread.currentThread().getName() + "抢到了第" + num + "张票,还剩" + count + "张票!");
  21. return true;
  22. }
  23. }

image.png