在学习aqs的过程中发现大量用到了thread的知识,因为aqs只是实现了一个双向阻塞队列,具体控制每条线程的执行情况还得靠thread。
1.run
run方法是运行但是他并没有正真开启线程
2.start
start方法是运行,它才是正真开启了线程
3.sleep
sleep方法是让线程休眠进入阻塞状态,调用需要传入休眠是时间,单位是nanos毫秒。
!!!思考:这里我插入一个题外话,如果某一时刻这条线程正在执行,这条线程就拥有了时间片,单通常情况下,我们研究多线程还涉及到一个同步资源锁。
也就是说多条线程竞争的有两样东西时间片和同步资源锁(也许还有别的,才疏学浅,暂时就想到这两个),也许某条线程抢到了时间片,但是他执行发现没有同步锁,也是没办法去顺利执行业务代码的,对吧?
也就是说一条线程想要战胜其他的线程,顺利的执行完业务代码,不仅仅要拿到时间片还要拿到同步资源锁,我们接着看。⬇️⬇️⬇️
sleep只会让出CPU执行时间片,并不会释放同步资源锁。
4.yield
该方法与sleep()方法类似,都是可以让当前正在运行的线程暂停,区别在于yieId()方法不会阻塞该线程,它只是将线程转换为就绪状态,让系统调度器重新调度一次,并且yieId()方法只能让优先级相同或者更高的线程有执行的机会。
5.wait(Object中的方法)
wait必须要和synchronized联用,wait和sleep相比不仅会让出时间片还会释放同步资源锁,不和synchronize联用会报错,然后wait还要和notify/notifyAll联用,也就是说当前线程wait了,要把别的线程唤醒。
class Boss_producer extends Thread{//生产者
//1.Boss_producer类表示包子店老板,是生产者
//2.List buns集合表示老板拥有的所有包子(此集合中放了很多包子对象)
LinkedList buns;
public Boss_producer(LinkedList buns) {
this.buns = buns;
}
public void run() {
//3.模拟做包子的过程:假设模拟制作5个包子就停下来
//(表示已经没地方放包子了,需要等待消费
// <够5个包子就调用wait方法表示老板线程Boss_producer阻塞>)
while(true) {
try {
synchronized (buns) {
Thread.sleep(900);
while (buns.size() == 10) {
System.out.println("集合已满,不再生产包子了。 "+
"唤醒正在wait的线程(消费者线程)去消费(吃)包子");
buns.notify();//表示唤醒多个正在wait线程中的任意一个
//buns.notifyAll();//表示唤醒多个正在wait线程中的任意一个
buns.wait();
}
String uuid = UUID.randomUUID().toString().toUpperCase() + "号包子";
System.out.println("Boss_producer.run:向buns集合添加" + uuid);
buns.add(uuid);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
class Consumer extends Thread{//消费者
private LinkedList buns_eat=null;
public Consumer(LinkedList buns) {
this.buns_eat = buns;
}
public void run() {
while(true){
try{
synchronized (buns_eat){
while(buns_eat.isEmpty()){
try {
System.out.println(Thread.currentThread().getName()+
"包子吃完了,等待出笼的新包子");
buns_eat.notify();//唤醒另一个线程(生产者线程)继续运行(生产包子)
buns_eat.wait();//让buns_eat所属的对象阻塞(消费者线程阻塞)
}catch (Exception e){
e.printStackTrace();
}
}
System.out.println("Consumer.run:从集合中取出包子消费"+
buns_eat.remove());
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
package com;
//吃包子案例
// (包子店老板生产10个包子然后阻塞,消费者就吃完10个包子然后阻塞,包子店老板再生产10个包子后又阻塞....)
//1.本案例演示的是(23种设计模式):生产者消费者模式
// (生产者线程负责生产数据<生产包子: 包子数量减少>, 消费者线程负责消费数据<吃包子: 包子数量增加>)
//注意:有兴趣的人可以找资料了解一下23种设计模式
//2.本案例也是: wait()和notify()用法演示案例 //wait()和notify()方法必须用在线程同步的语法情景内(要用在synchronized内)
import java.util.LinkedList;
import java.util.UUID;
public class EatBunDemo {
public static void main(String[] args) {
LinkedList buns=new LinkedList();//存储包子的集合
new Boss_producer(buns).start();
new Consumer(buns).start();
}
}
6.interrupt
中断线程,呵呵,