JAVA中高并发编程相关问题

摘要

根据以下知识点展开JAVA高并发编程中的相关问题,包括同步异步概念区分、并发并行区别、进程线程区别、线程中start()和run()方法区别。相关概念均来源于“黑马程序员”免费视频,所有概念按照做博客主本人凭理解编写,若有错误,见谅。

同步和异步

假如项目中,两个线程各自在运行,A和B,线程A先运行到即将结束,
同步:如果A必须等待B运行完,A才能结束就是同步。
异步:如果A不需要等待B运行完,A就可以先结束就是异步。

并发和并行

并发:假如此时自己的电脑是单核CPU,也就是说在这种情况下,有两个任务进到CPU等待执行,这个时候CPU的任务调度器会执行A一会,去执行B,再回来执行A,再执行B,让用户感觉不出来在挨个执行任务(同一时间应对多任务的能力)。
并行:假如此时自己的电脑是多核CPU,也就是说在这种情况下,有两个任务进到CPU等待执行,这个时候CPU的任务调度器会让第一个CPU核心执行A,让第二个CPU核心去执行B,彼此各自执行(同一时间做多件事的能力)。

进程和线程

简单理解就是集合与子集的关系,进程包含多个线程。进程可以看成任务单位,线程可以看成指令单位。

线程中start()和run()

如果一个线程不执行start方法,而是直接通过main方法执行run方法,那和普通方法调用没有区别,还是由主线程来执行,没有其他线程出现。

线程中sleep()和yield()方法

同样是让当前线程让出CPU使用权,但是sleep()是阻塞的,yield()不是,换言之,sleep()会睡足够时间再去CPU排队等待执行,而yield()只是立刻让出CPU使用权,但同时可以立即再次开始执行。
从运行状态来讲,sleep()将会从Running状态变成TIME_WAITED,而yield()状态会从Running变成Runnable。

join()方法

thread.join()那么主线程将等待thread线程执行完毕再继续执行。结合之前写到了的同步异步的问题,join最简单的可以实现一个异步变同步的实践。也有join(long n)指定等待时间。底层由wait()方法实现。

public class Main {
    static int temp=0;
    public static void main(String[] args) throws InterruptedException {

        Thread t1 = new Thread(()-> {
                System.out.println("start...");
                try {
                    Thread.sleep(1000);
                    temp=10;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        t1.start();
        t1.join();
        System.out.println("result is:"+temp);
        System.out.println("end");

    }
}

interrupt()方法

阻塞状态的线程被调用interrupt()方法,打断标记会变成false;正常运行的线程被调用interrupt(),打断标记变成true。
遇到的相关面试问题:如何优雅的停止一个正在运行的线程-> 这个时候主线程调用interrupt()方法,判断线程打断标记状态,为true,停止线程。(此时线程自动善后)

线程状态

线程状态
线程声明未引用时,初始状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值