java线程

1. java线程池的参数

java线程池的参数:
1.corePoolSize:核心线程数
2.maximumPoolSize:最大线程数
3.keepAliveTime:临时线程存活时间
4.unit:时间单位
5.workQueue:工作队列
6.threadFactory:线程工厂
   创建线程的工厂,可以设定线程名、线程编号等。
7.handler:拒绝策略
   AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
   DiscardPolicy:丢弃任务,但是不抛出异常。可能导致无法发现系统的异常状态。
   DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务。
   CallerRunsPolicy:由调用线程处理该任务。

2. java实现多线程的方法

继承 Thread 类

1. 创建 MyThread 类,让其继承 Thread 类并重写 run() 方法。
2. 创建 MyThread 类的实例对象,即创建一个新线程。
3. 调用 start() 方法,启动线程。

实现 Runnable 接口

1. 创建 MyRunnable 类实现 Runnable 接口。
2. 创建 MyRunnable 类的实例对象 myRunnable 。
3. 把实例对象 myRunnable 作为参数来创建 Thread 类的实例对象 thread,实例对象 thread 就是一个新线程。
4. 调用 start() 方法,启动线程。

实现 Callable 接口

创建 MyCallable 类实现 Callable 接口。
创建 MyCallable 类的实例对象 myCallable。
把实例对象 myCallable 作为参数来创建 FutureTask 类的实例对象 futureTask。
把实例对象 futureTask 作为参数来创建 Thread 类的实例对象 thread,实例对象 thread 就是一个新线程。
调用 start() 方法,启动线程。       

线程池

1.Executors.newCachedThreadPool()

创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程, 适用于服务器负载较轻,执行很多短期异步任务

2.Executors.newFixedThreadPool(3)

创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待,适用于可以预测线程数量的业务中,或者服务器负载较重,对当前线程数量进行限制。

3.Executors.newScheduledThreadPool(3)

创建一个定长线程池,支持定时及周期性任务执行,适用于需要多个后台线程执行周期任务的场景。

4.newSingleThreadExecutor()

创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行,适用于需要保证顺序执行各个任务,并且在任意时间点,不会有多个线程时活动的场景。

5.Executors.newWorkStealingPool()

创建一个拥有多个任务队列的线程池,可以减少连接数,创建当前可用cpu数量的线程来并行执行,适用于大耗时的操作,可以并行来执行

3.java中run方法和start方法的区别

1. run() 方法是线程的主体,它是线程需要执行的方法,线程启动后会自动执行 run() 方法中的代码。run() 方法通常包含线程的执行逻辑,可以通过重写 run() 方法来实现自定义逻辑。

2. start() 方法是线程的启动方法,它是一个系统级别的方法,用于启动一个新线程。start() 方法会使 JVM 开辟一个新的线程,并在新的线程中运行当前线程对象的 run() 方法,而不是 run() 方法在当前线程中直接执行。也就是说,调用 start() 方法后,线程的状态变为可运行状态,JVM 会自动创建一个新线程,并在新线程中执行 run() 方法,直到 run() 执行结束或者调用了 stop() 方法。

run() 方法是用户自定义的业务方法,直接调用 run() 仅仅是方法的调用,而 start() 方法是启动新线程的方法,内部会自动调用 run() 方法来执行线程的任务。

4.线程和协程的区别

协程是用户态的轻量级线程,不需要内核调度,由程序控制;线程是内核态的任务调度和执行的最小单位,需要内核调度。

协程是异步机制,能保留上一次调用的状态,每次重入时,就相当于进入上一次调用的状态;线程是同步机制,运行状态切换及上下文切换需要消耗系统资源。

协程是非抢占式的,同一时间只有一个协程拥有运行权,相当于单线程的能力;线程是抢占式的,同一时间可以有多个线程并行,但需要同步原语来保护临界区。

5.线程和进程的区别

根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位

资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的

影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行

6.进程间的通信方式

管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
共享存储SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
套接字Socket:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生

7.wait和sleep的区别

  • 26
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值