线程状态、同步

 

 

关于线程5种状态,创建、就绪、运行、阻塞、死亡;学习时候主要理解逻辑结构,这样5种状态就能够很容易的掌握理解,上面结构希望对你们理解有所帮助。

其次最难掌握的就是线程同步时的状态 ,当某个线程thread1获得synchronized同步锁,其他线程进入阻塞状态,直到thread1线程释放同步锁时候,其他线程通过notify()唤醒线程重新获得同步锁,等待cpu调度,就绪状态,获得CPU后在进入运行状态。

对于线程同步:存在共享同一数据源的时候,存在线程安全。
主要通过二种:同步方法和同步代码块
public synchronized void run(){
sale();//多线程时,同步方法运行时候有可能需要等待长时间,效率低
}

public void run(){
while(true){
synchronized(this){//同步代码块,效率相比较高
sale();
}
}
}

关于初学者,能够知道理解这些知识我感觉已经够了。如有不足,希望多多指正,谢谢

 六种说法:

 

复制代码
public class TheatDemo {
    public static void main(String[] args) throws InterruptedException {
        // 线程状态 NEW
        Thread t1 = new Thread(() -> {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }, "线程1:");
        System.out.println(t1.getName() + t1.getState());

        // 线程状态 RUNNABLE
        Thread t2 = new Thread(() -> {
            while (true) {
            }
        }, "线程2:");
        t2.start();
        Thread.sleep(1000);
        System.out.println(t2.getName() + t2.getState());

        // 线程状态 BLOCKED
        Object obj = new Object();
        Thread t3 = new Thread(() -> {
            synchronized (obj) {
            }
        }, "线程3:");
        synchronized (obj) {
            t3.start();
            Thread.sleep(500);
            System.out.println(t3.getName() + t3.getState());
        }

        // 线程状态 WAITING
        Thread t4 = new Thread(() -> {
            synchronized (obj) {
                try {
                    obj.wait();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }, "线程4:");
        t4.start();
        Thread.sleep(500);
        System.out.println(t4.getName() + t4.getState());

        // 线程状态 WAITING
        Thread t5 = new Thread(() -> {
            synchronized (obj) {
                try {
                    obj.wait(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }, "线程5:");
        t5.start();
        Thread.sleep(500);
        System.out.println(t5.getName() + t5.getState());

        // 线程状态 TERMINATED
        Thread t6 = new Thread(() -> {
        }, "线程6:");
        t6.start();
        Thread.sleep(500);
        System.out.println(t6.getName() + t6.getState());
    }
}
复制代码

 

posted @   chch213  阅读(240)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探
点击右上角即可分享
微信分享提示