线程

线程的生命周期

  • new() 出生
  • start() 就绪 等待CPU调度
  • Running 运行
  • wait() 等待
  • sleep() 休眠
  • IO请求阻塞
  • stop() 死亡

线程的优先级和线程的调度

  • 优先级
类型 名称 说明
static int MAX_PRIORITY 最大优先级为10
static int MIN_PRIORITY 最小优先级为1
static int NORM_PRIORITY 默认优先级5
void setPriority(int newPriority) 设置优先级1~10

线程的优先级只代表,该线程获得CPU调度的概率,是个概率事件,不一定优先级大的就一定先获得CPU的执行

什么是守护线程

setDaemon() //守护线程,就是主线程结束他就结束

  • 线程的调度

正在执行的线程调用yield方法,使其他线程有获得CPU执行的机会

  • 多线程的实现
  • 继承Thread类,重写run()方法
  • 实现Runnable接口,实现run()方法 (推荐做法)
class MyThread1 extends Thread{
    public void run(){}
}

class MyThread2 implements Runnable{
    public void run(){}
}
//启动多线程
MyThread1 t1 = new MyThread1();
t1.start();

Thread t2 = new Thread(new MyThread2());
t2.start();

线程的终止

  • 已经停止使用stop() suspend()方法
public void run(){
    while(true){
        doSomeWork();
        if(flag){ //flag为外部的某些条件,满足的时候停止执行
            break;
        }
    }
}

public void run(){
    while(!flag){ //flag为外部的某些条件,满足的时候停止执行
        doSomeWork();
    }
}

线程的同步

  • 线程之间的一种制约关系
  • 线程的互斥是指,访问共享资源时,单个线程的排他性
  • 同步方法
public synchronized 返回值类型 方法名(){
    
}
  • 同步块
synchronized(互斥对象){
    
}
wait(); 使线程进入阻塞状态,释放锁
notify(); 使线程进入可运行状态
//通过类的监视器实现
  • 每个类都有一个监视器 (monitor)

    • 可以理解为是一个房间的所有墙
      线程之间的通信
graph LR
a[PipedWriter/PipedOutputStream]-->b[管道]
b-->c[PipedReader/PipedOutputStream]
  • 管道是单向的
    • 实现两个线程之间的通信必须建立两条管道
  • 传输的数据的顺序是严格且有顺序的,接收方接受到的顺序和发送方发送的顺序是一致的

死锁问题

  • 经典的哲学家问题
原文地址:https://www.cnblogs.com/fiwen/p/9005398.html