线程和进程

线程和进程的区别

进程

程序由指令和数据组成

指令的运行和数据的读写依赖于将指令加载到CPU,数据加载到内存,在指令运行过程中还需要用到IO设备

进程就是用以加载指令,管理内存,管理IO的
当一个程序被运行,从磁盘加载这个程序的代码到内存,就开启了一个线程
多实例进程和单实例进程

是否能在系统中打开多份

线程

一个线程就是一个指令流

将指令流中的指令交给CPU执行

一个进程中可以有多个线程

对比

进程是运行程序的实例,进程包含了多个线程,每个线程任务不同

不同进程使用不同内存空间,当前进程下的所有线程可以共享内存空间

线程更加轻量,切换相较进程成本低

并行和并发的区别

对于单核CPU来说,所有线程都是串行执行,将时间片分给不同的程序使用,在不同线程间来回切换.(并发)

对于多核CPU来说,就可以实现并行执行,不同核心在同一时间片内执行不同线程.(并行)

线程的状态和状态切换

NEW
//等待启动
RUNNABLE
//可运行
BLOCKED
//阻塞
WAITING
//等待
TIMED_WAITING
//指定等待时间
TERMINATED
//终止

新线程(NEW)在start()方法启动时变为就绪状态->运行状态(RUNNABLE),运行结束后终止被回收(TERMINATED)

如果加锁,线程被锁阻塞即BLOCKED状态

如果被wait()即WAITING状态

如果被sleep(100)即TIMED_WAITING状态

创建线程的方式有哪些

继承Thread()类
//重写run方法
class MyThread() extends Thread{
	@Override
    public void run(){
        
    }
}
实现runnable接口
//重写run方法
class MyRunnable inplements Runnable{
    @Override
    public void run(){
        
    }
}
实现Callable接口
//重写call方法
class MyCallable implements Callable<String>{
    @Override
    public String call(){
        
    }
}

main(){
    MyCallable mc = new MyCallable();
    FutureTask<String> ft = new FutureTask<String>(mc);
    Thread t1 = new Thread(ft);
    String result = ft.get();
}
线程池创建线程
//创建线程池对象
public ThreadPoolExecutor(
	int corePoolSize,
	int maximumPoolSize,
	long keepAliveTime,
	TimeUnit unit,
	BlockingQuene workQueue,
	ThreadFactory threadFactory,
	RejectedExecutionHandler handler
)
new ThreadPoolExecutor(...);
TE.submit()

corePoolSize:指定线程池的核心线程数量

maximumPoolSize:指定线程池的最大线程数量(核心+临时)

keepAliveTime:指定临时线程的存活时间

unit:指定临时线程存活的时间单位(秒,分,时,天)

workQueue:指定线程池的任务队列,阻塞队列(BlockingQueue<>的实现类对象)

threadFactory:指定线程池的线程工厂(创建线程的地方)

handler:指定线程池的任务拒绝策略(任务队列满时,新任务来怎么处理)

runnable 和 callable 的区别

1,Runnable接口run方法没有返回值,但callable接口call方法有泛型返回值,和Future和FutureTask配合可以用以获取异步执行的结果

2,call()方法允许抛出异常,但run()方法抽象方法声明时没有抛出,所以run()方法重写时只能在内部处理不能抛出

线程的执行

使用start()启动,只能执行一次调用run方法中的逻辑,(开启线程执行)

保证线程的顺序执行

join方法

使用join()方法可以阻塞当前的线程,直到调用join()方法的线程执行完毕才会继续执行

eg:

new Thread(()->{
	t1.join;
})

直到线程t1执行结束之后才会继续执行

notify()和notifyAll()的区别

notify():随机唤醒一个线程

notifyAll():唤醒所有wait()的线程

wait()方法和sleep()方法的异同

同:都能让目前线程暂时放弃cpu使用权,陷入阻塞状态

异:

方法归属不同

sleep()方法是Thread的静态方法

wait()方法是Object的成员方法

醒来时机不同

sleep(100)和wait(100)都会在对应时间后醒来

但wait()如果不被唤醒就会一直阻塞

都可以被打断唤醒

锁特性不同

wait方法的调用必须先获取wait对象的锁,(必须和synchronized一起使用)

sleep不需要

wait方法执行后会先释放锁,允许其他线程竞争

但sleep方法执行后不会释放锁

你可能感兴趣的:(Javaweb技术点补充,java,jvm,开发语言)