JUC(一)

一、进程和线程的关系

1.1 进程

一个在内存运行的应用程序。每个进程都有自己独立的一块内存空间,用于加载执行指令等。

例如:在Windows中,执行一个exe就是一个进程;在Java中,执行java -jar xxxx.jar,就是开启一个JVM进程。

1.2 线程

线程是进程中的一个执行单元,一个进程至少有一个线程,可以运行多个线程。在Java中,执行程序的入口main(),会开启一个主线程,然后在主线程中,可以开启多个线程。

JVM内存结构中,方法栈本地方法栈程序计数器是线程私有的,方法区是线程共享的。

二、Java线程创建(未使用线程池)

  • 使用Thread类

    Thread thread = new Thread(){
                @Override
                public void run() {
                    log.debug("thread running...");
                }
            };
            log.debug("main start other thread...");
            thread.setName("create");
            thread.start();
            log.debug("main end...");
    
  • 使用Thread类Runnable接口

    Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    log.debug("runnable create thread...");
                }
            };
            Thread thread = new Thread(runnable,"runnable");
            log.debug("main start other thread...");
            thread.start();
            log.debug("main end...");
    
  • 使用Thread类FutureTask接口

    FutureTask<String> futureTask = new FutureTask<String>(new Callable<String>() {
                @Override
                public String call() throws Exception {
                    log.debug("future task do something...");
                    return "future task...";
                }
            });
            Thread futureTaskThread = new Thread(futureTask, "futureTask");
            log.debug("future task thread start...");
            futureTaskThread.start();
            log.debug("{}", futureTask.get());
            log.debug("future task thread end...");
    

    :FutureTask接口是一个带返回值线程接口,当调用futureTask.get()方法时,主线程会阻塞,等待call()方法执行结束,并返回数据。

三、Java线程常见方法

方法名描述
start()用于开启一个线程
run()执行线程的业务逻辑,当一个线程开启后,会执行run()方法里的逻辑。
sleep()让当前线程睡眠,进入阻塞状态;当睡眠时间结束,则等待获取CPU执行时间。
yield()当前线程放弃CPU资源,从运行状态进入就绪状态,和其他线程共同竞争CPU执行权。
join()等待线程运行结束
interrupt()将线程中断标志interrupted设置true,当线程处于sleepwaitjoin阻塞状态,则会抛出InterruptedException异常,并将interrupted状态设置为false
stop()暴力停止线程;不推荐使用因为会将线程直接停止,如果有未执行完的程序,也会被直接停止。例如:线程A加了锁,直接停止,未释放锁,如果线程B正等待该锁释放,则线程B会死锁;停止线程推荐使用两阶段终止模式

两阶段终止模式:使用interrupt()打断线程,线程自己通过interrupted判断是否打断,如果被打断,则自己判断何时执行结束(例如:释放锁后线程在执行结束)。

四、主线程和守护线程

  • 主线程:主要运行main方法。
  • 守护线程:用于服务其它线程(主线程和主线程中创建的线程),当主线程执行结束,此时JVM退出,无论守护线程执行到哪,都会强制关闭,因为此时程序已经执行完毕。
    • Java最常见守护线程是:垃圾回收哦器线程。

五、Java线程状态

5.1 操作系统层面划分线程状态(五种)

在这里插入图片描述

  • 初始状态

    当定义了一个线程,此时线程处于初始状态,未与操作系统产生关联。

  • 可运行状态

    当线程被创建后,等待获得CPU的执行时间。

  • 运行状态

    线程获得CPU的执行时间;当CPU执行时间片结束,线程还未执行结束,则会由【运行状态】切换到【可运行状态】,等待获取下次的执行时间片;如果线程执行结束,则切换到【终止状态】。

  • 阻塞状态

    当【运行状态】的线程调用BIO等阻塞API时,此时线程无需CPU参与,会让出CPU执行时间片,进入【阻塞状态】;当阻塞API执行结束,线程会从【阻塞状态】切换到【可运行状态】,等待下次执行时间片。

  • 终止状态

    线程执行结束,进入【终止状态】;此时,线程的生命周期也结束。

5.2 Java代码层面划分线程状态(六种)

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值