Java多线程系列——基础篇

     今天来说说多线程,看了很多遍的多线程,看完一直忘记、混淆。当然和平时的代码量有关系。好记不如烂博客。让我们开始吧。

首先我们先看一张多线程的五种状态图。新建、就绪、阻塞、运行、死亡。

1.新建状态:new Thread();新创建一个线程

2.就绪状态:start()。就绪状态的线程,随时可能被cpu运行

3 运行状态:线程获取了cpu权限进行执行,注意,运行状态一定得从就绪状态转变过来。

4 阻塞状态:线程由于某种原因对cpu放弃了竞争使用。直到进入就绪状态才有可能获得cpu的使用。

同步阻塞:线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。

等待阻塞:通过调用线程的wait()方法,让线程处于等待状态,直达被唤醒。

其他阻塞:通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

 

简单的一些api的使用我就不说了,网上特别多。说几个我认为不容易理解的。

1.synchronized

首先,什么是锁?

在java中,每一个对象有且仅有一个同步锁。这也意味着,同步锁是依赖于对象而存在。 当我们调用某对象的synchronized方法时,就获取了该对象的同步锁。例如,synchronized(obj)就获取了“obj这个对象”的同步锁。 不同线程对同步锁的访问是互斥的。也就是说,某时间点,对象的同步锁只能被一个线程获取到!通过同步锁,我们就能在多线程中,实现对“对象/方法”的互斥访问。 例如,现在有两个线程A和线程B,它们都会访问“对象obj的同步锁”。假设,在某一时刻,线程A获取到“obj的同步锁”并在执行一些操作;而此时,线程B也企图获取“obj的同步锁” —— 线程B会获取失败,它必须等待,直到线程A释放了“该对象的同步锁”之后线程B才能获取到“obj的同步锁”从而才可以运行。

锁的使用有两种:

1.在方法上加锁 public synchronized void test(){}

2.在代码块加锁 synchronized(this){}、synchronized(object){}、synchronized(A.class){}

2.wait() 和notify()

首先,什么是wait()?notify()?

在Object.java中,定义了wait(), notify()和notifyAll()等接口。wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。而notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程;notify()是唤醒单个线程,而notifyAll()是唤醒所有的线程。

注意使用对象A使用wait()、notify()  一定需要当前线程 对象A 加了锁,才能使用。

3.消费者和生成者demo

一个入门的demo 强烈建议大家去试着写写。

业务场景:A厂每3秒生产一个苹果,生产的苹果都会放进仓库B(最大可容纳是20个),当仓库有苹果的时候,有n个消费者可以每2秒拿n个苹果。仓库满了,A不生产,没满继续生产。仓库有苹果,消费者就会去拿苹果,如果仓库为空就不去拿。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值