1.进程与线程?

学过计算机操作系统我们都知道,进程就是运行中的程序,是一个具有一定独立功能的一次运行活动。他是操作系统动态执行的基本单元,在传统的操作系统中,进程既是分配单元,也是基本的执行单元,进程是操作系统最小资源分配单元。 线程:线程是操作系统最小调度单元,通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程可以利用进程所拥有的资源,在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统多个程序间并发执行的程度。

2.进程与线程的具体案例

使用QQ,查看进程一定有一个QQ.exe的进程,我可以用qq和A文字聊天,和B视频聊天,给C传文件,给D发一段语言,QQ支持录入信息的搜索。

大四的时候写论文,用word写论文,同时用QQ音乐放音乐,同时用QQ聊天,多个进程。

打游戏时通常可以同时边攻击边移动键,当角色攻击和移动时,就可以看作一个攻击线程和移动线程,这个游戏可以看作是一个进程。

3.线程状态

上面是传统意义上的操作系统的线程和进程,下面是在Java中线程的实际状态。 其包括了 NEW 新建、RUNNABLE 准备就绪、BLOCKED阻塞、WATING阻塞(与BLOCKED不同)、TIMED_WAITING(定时,过期不候)、TERMINATED;(终结)。

Thread.State
public enum State {
/**
     * Thread state for a thread which has not yet started.
     */
NEW,(新建)

/**
     * Thread state for a runnable thread.  A thread in the runnable
     * state is executing in the Java virtual machine but it may
     * be waiting for other resources from the operating system
     * such as processor.
     */
RUNNABLE,(准备就绪)

/**
     * Thread state for a thread blocked waiting for a monitor lock.
     * A thread in the blocked state is waiting for a monitor lock
     * to enter a synchronized block/method or
     * reenter a synchronized block/method after calling
     * {@link Object#wait() Object.wait}.
     */
BLOCKED,(阻塞)

/**
     * Thread state for a waiting thread.
     * A thread is in the waiting state due to calling one of the
     * following methods:
     * 

     *   

{@link Object#wait() Object.wait} with no timeout
     *   

{@link #join() Thread.join} with no timeout
     *   

{@link LockSupport#park() LockSupport.park}
     * 
     *
     * 
A thread in the waiting state is waiting for another thread to
     * perform a particular action.
     *
     * For example, a thread that has called Object.wait()
     * on an object is waiting for another thread to call
     * Object.notify() or Object.notifyAll() on
     * that object. A thread that has called Thread.join()
     * is waiting for a specified thread to terminate.
     */
WAITING,(不见不散)

/**
     * Thread state for a waiting thread with a specified waiting time.
     * A thread is in the timed waiting state due to calling one of
     * the following methods with a specified positive waiting time:
     * 

     *   

{@link #sleep Thread.sleep}
     *   

{@link Object#wait(long) Object.wait} with timeout
     *   

{@link #join(long) Thread.join} with timeout
     *   

{@link LockSupport#parkNanos LockSupport.parkNanos}
     *   

{@link LockSupport#parkUntil LockSupport.parkUntil}
     * 
     */
TIMED_WAITING,(过时不候)

/**
     * Thread state for a terminated thread.
     * The thread has completed execution.
     */
TERMINATED;(终结)
}

ps:BLOCKED阻塞与WATING阻塞,既然都是阻塞,还要分成这两种,除了场景不同外,肯定还有底层更深层次的原因。 个人认为更加本质的区别是,blocked 状态指的是进行系统调用,通过操作系统挂起线程后,线程的状态。而 waiting 状态则不需要进行系统调用,是一种 JVM 层面的线程阻塞后的状态。由于转换到 blocked 状态需要进行系统调用,所以到这个状态的转换操作比较重。

4.wait/sleep区别

功能都是当前线程暂停,有什么区别? wait放开手去睡,放开手里的锁 sleep握紧手去睡,醒了手里还有锁 简而言之,使用wait会将当前线程所占用的锁释放,而sleep则继续持有锁

5.JUC、并发、并行

JUC是java.util.concurrent在并发编程中使用的工具类的简称,其包下涵盖了JDK关于多线程的各种类 并发: 同一时刻多个线程在访问同一个资源,多个线程对一个点 例子:小米9今天上午10点,限量抢购 春运抢票 电商秒杀... 并行: 多项工作一起执行,之后再汇总 例子:泡方便面,电水壶烧水,一边撕调料倒入桶中