Java 多线程

什么是进程?什么是线程?

进程:在一个操作系统中,每个独立执行的程序都可以称为一个进程

线程:在一个进程中可以有多个执行单元同时执行,而这些执行单元就是线程

ps:创建进程比创建线程开销大,尤其时在Windows系统

进程间通信比线程间通信慢,因为线程间通信就是读写同一个变量,故而速度很快

线程的生命周期及状态转换

  • 新建状态:创建一个线程对象后,该线程对象就处于新建状态,它此时仅仅由Java虚拟机分配了内存,没有任何线程的动态特征
  • 就绪状态:当线程对象调用了start后,该线程就进入了就绪状态,位于线程队列中,具备运行的条件,能否获取CPU的使用权并开始运行,需等待系统的调度
  • 运行状态:如果处于就绪状态的线程获取了CPU的使用权并开始执行run方法中的线程执行体,那该线程就处于运行状态
  • 阻塞状态:一个正在执行的线程在某些特殊情况下,会让出CPU的使用权并暂时中止自己的执行,进入到阻塞状态
  • 死亡状态:如果线程调用stop方法或者run方法执行完毕,又或者是线程抛出了一个未捕获的异常、错误,那该线程就进入了死亡状态
     

线程的创建

线程的创建一:继承Thread类,重写run方法,在测试类创建对象并调用start方法开启线程

public class MYThread extends Thread {
    @Override
    public void run() {
//        super.run();
        System.out.println("创建线程一");
    }
}

线程的创建二:实现Runnable接口,重写run方法,在在测试类创建对象并调用Thread有参构造创建线程对象再调用start方法开启线程

public class MYThread2 implements Runnable{
    @Override
    public void run() {
        System.out.println("创建线程二");
    }
}

实现Callable接口和线程池的创建方式暂不提及....毕竟我还不会用,看看别人的怎么理解的 http://t.csdn.cn/7PKDf

 线程的调度

线程的调度:Java虚拟机会按照特定的机制为程序中的每个线程分配CPU的使用权,这种机制称为线程的调度

线程的优先级:1-10,值越大优先级越高(只是获取CPU的概率增大,并不是一定就能获取CPU使用权)

线程休眠

让当前线程暂停执行,从运行状态进入阻塞状态,将 CPU 资源让给其他线程的调度方式,通过sleep() 来实现

sleep(long millis),调用时需要传入休眠时间,单位为豪秒

线程合并

合并是指将指定的某个线程加入到当前线程中,合并为一个线程,由两个线程交替执行变成一个线程中的两个自线程顺序执行,通过调用join()方法实现

线程A和线程B,线程A执行到某个时间点的时候调用线程B的 join方法,则表示从当前时间点开始 CPU 资源被线程B独占,线程A进入阻塞状态,直到线程B执行完毕,线程A进入就绪状态,等待获取 CPU 资源进入运行状态

join 方法的两种使用方式:

  • join() 表示B线程执行完毕之后才能执行其他线程
  • join(long millis) 表示B线程执行 millis 毫秒之后,无论是否执行完毕,其他线程都可以和它争夺 CPU 资源

线程让步

线程礼让是指在某个特定的时间点,让线程暂停抢占 CPU 资源的行为,运行状态/就绪状态—》阻塞状态,将 CPU 资源让给其他线程来使用,通过yield()方法实现

假如线程A和线程B在交替执行,某个时间点线程A做出了礼让,所以在这个时间节点线程B拥有了 CPU 资源,执行业务逻辑,但不代表线程A一直暂停执行

线程A只是在特定的时间节点礼让,过了时间节点,线程A再次进入就绪状态,和线程B争夺 CPU 资源

线程中断​​​​​​​

  • 线程执行完毕自动停止(被动停止)
  • 线程执行过程中遇到错误抛出异常并停止(被动停止)
  • 线程执行过程中根据需求手动停止(主动停止)

Java 中实现线程中断有如下几个常用方法:

public void stop()
public void interrupt()
public boolean isInterrupted()

多线程同步(多线程容易出现bug)

解决的办法:同步方法和同步代码块

同步方法:

即有synchronized关键字修饰的方法,由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。需要注意, synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类

同步代码块:

即有synchronized关键字修饰的语句块,被该关键字修饰的语句块会自动被加上内置锁,从而实现同步。需值得注意的是,同步是一种高开销的操作,因此应该尽量减少同步的内容。通常没有必要同步整个方法,使用synchronized代码块同步关键代码即可

 

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值