Java核心编程day5 (线程)

文章介绍了Java线程的六种状态,包括新建、就绪、锁阻塞、无限等待、计时等待和死亡,并详细阐述了状态转换。此外,讨论了线程间的通信以及sleep和wait方法的区别。文章还强调了线程池的作用,如降低资源消耗和提高响应速度,并给出了模拟创建线程池的示例。
摘要由CSDN通过智能技术生成

一、线程状态

1、新建(new):创建了线程,还没有调用start()方法。

2、就绪(Runnable):调用了start方法后,线程处于可运行状态,线程可能不会立即执行,需要等待CPU的调度。

3、锁阻塞(Blocked):没有获取到锁对象时,等待另一个获取到锁的线程释放锁

4、无限等待(Waiting):执行wait()方法后,线程处于无线等待,此时线程必须靠其他线程调用notify()或者notifyAll方法将其唤醒

5、计时等待(Time_Waiting):执行sleep(time)或者wait(time)方法后,线程处于计时等待,要么得到线程后自醒,要么时间未到被其他线程执行notify唤醒

6、死亡(Terminated):执行完run方法,或者发生了异常没有处理时线程强制退出

二、补充问题

(1)线程获得锁后处于什么状态?

处于就绪态。

(2)线程处于无线状态被唤醒后,可能处于什么状态?

没有获得锁对象时,进入到阻塞状态,获得到锁后,可进入运行状态

(3)sleep和wait得区别:

sleep如果线程获得锁后,执行sleep不会释放锁,wait会释放锁

(4)notify()和notifyAll()的区别:

如果有多个线程处于无限等待状态时,notify会随机唤醒一个线程,notifyAll会将所有等待的线程唤醒,被唤醒过后的线程, 可能处于可运行状态或锁阻塞状态。

ps:notify()和notifyAll()不会释放锁

三、线程之间得通信

四、线程池:降低开销

当我们使用Thread来创建和开启线程,如果创建的线程数量过多,频繁的创建和销毁线程会消耗大量的资源,所以使用线程池来创建线程可以极大的降低线程在创建和消耗时所使用的资源。

使用线程池的好处:

1、提高相应速度(减少创建线程的时间)

2、降低资源消耗(重复利用线程池中,不需要每次都创建)

3、便于线程管理corePoolSize:核心池的大小

模拟创建线程池:

public class MyThreadPool {
    public static void main(String[] args) {
        MyThreadPool p = new MyThreadPool(5);
        System.out.println(p.list);
        Thread t=p.getThread();
        System.out.println(p.list);
        p.returnThread(t);
        System.out.println(p.list);
    }

    //1.声明一个LinkedList存储Thread对象
    private LinkedList<Thread> list;
    //2.构造函数初始化
    public MyThreadPool(int num){
        this.list=new LinkedList<>();
        /3./存储Thread对象
        for (int i = 1; i <=num ; i++) {
            list.add(new Thread("线程"+i));
        }
    }
    /4./取出对象
    public Thread getThread(){
        return list.get(0);
    }
    //5.归还
    public void returnThread( Thread t){
        list.add(t);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值