摘要
根据以下知识点展开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,停止线程。(此时线程自动善后)
线程状态
线程声明未引用时,初始状态。