thread常用方法汇总

在学习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
中断线程,呵呵,

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值