Java 多线程

Java 多线程

Java中的多线程是同时执行多个线程的过程。
一个线程是轻量级子过程,最小的处理单元。多处理和多线程都用于实现多任务。
但是,由于线程使用共享内存区域,因此我们使用多线程而不是多处理。它们不分配单独的内存区域,因此节省了内存,并且线程之间的上下文切换比进程花费的时间更少。
Java多线程技术主要用于游戏,动画等。

Java多线程的优点

1)不会阻塞用户,因为线程是独立的,并且您可以在线程上执行多项操作
2)可以一起执行许多操作,因此可以节省时间。
3)线程是
独立的 ,因此如果单个线程中发生异常,它不会影响其他线程。

多任务处理

多任务处理是同时执行多个任务的过程。我们使用多任务来利用CPU。多任务可以通过两种方式实现:

基于过程的多任务处理(多处理)
基于线程的多任务处理(多线程)

1)基于流程的多任务处理(多处理)

每个进程在内存中都有一个地址。换句话说,每个进程分配一个单独的内存区域。
一个过程很重要。
进程之间的通讯成本很高。
从一个过程切换到另一个过程需要一些时间来保存和加载寄存器,内存映射,更新列表等。

2)基于线程的多任务处理(多线程)

线程共享相同的地址空间。
线程是轻量级的。
线程之间的通信成本很低。

注意: 每个线程至少需要一个进程。

Java中的线程是什么?

线程是轻量级子进程,是最小的处理单元。这是一条单独的执行路径。
线程是独立的。如果一个线程中发生异常,则不会影响其他线程。它使用共享存储区。

Java 多线程_https://bianchenghao6.com_【Java 基础教程】_第1张

如上图所示,线程在进程内部执行。线程之间存在上下文切换。OS内可以有多个进程,并且一个进程可以具有多个线程。
注意: 一次只执行一个线程。

Java线程类

Java提供了
Thread class 来实现线程编程。线程类提供构造器和方法来创建和执行线程上的操作。线程类扩展对象类并实现Runnable接口。

Java线程方法

修饰符和类型 方法 说明
void start() 它用于启动线程的执行。
void run() 它用于对线程执行操作。
static void sleep() 它使线程休眠指定的时间。
static Thread currentThread() 它返回对当前正在执行的线程对象的引用。
void join() 它等待线程死亡。
int getPriority() 它返回线程的优先级。
void setPriority() 它将更改线程的优先级。
String getName() 它返回线程的名称。
void setName() 它将更改线程的名称。
long getId() 它返回线程的ID。
boolean isAlive() 它测试线程是否还活着。
static void yield() 这将导致当前正在执行的线程对象暂停并允许其他线程临时执行。
void suspend() 它用于挂起线程。
void resume() 它用于恢复挂起的线程。
void stop() 它用于停止线程。
void destroy() 它用于销毁线程组及其所有子组。
boolean isDaemon() 它测试线程是否是守护线程。
void setDaemon() 它将线程标记为守护程序或用户线程。
void interrupt() 它将中断线程。
boolean isinterrupted() 它测试线程是否已被中断。
static boolean interrupted() 它测试当前线程是否已被中断。
static int activeCount() 它返回当前线程的线程组中活动线程的数量。
void checkAccess() 它确定当前正在运行的线程是否有权修改该线程。
static boolean holdLock() 仅当当前线程在指定对象上拥有监视器锁时,它才返回true。
static void dumpStack() 它用于将当前线程的堆栈跟踪信息打印到标准错误流中。
StackTraceElement [] getStackTrace() 它返回表示线程堆栈转储的堆栈跟踪元素数组。
static int enumerate() 用于将每个活动线程的线程组及其子组复制到指定的数组中。
Thread.State getState() 它用于返回线程的状态。
ThreadGroup getThreadGroup() 用于返回该线程所属的线程组
String toString() 它用于返回此线程的字符串表示形式,包括线程的名称,优先级和线程组。
void notify() 它仅用于通知正在等待特定对象的一个​​线程。
void notifyAll() 它用于向特定对象的所有等待线程发出通知。
void setContextClassLoader() 它为线程设置上下文ClassLoader。
ClassLoader getContextClassLoader() 它返回线程的上下文ClassLoader。
static Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler() 它返回由于未捕获的异常而导致线程突然终止时调用的默认处理程序。
static void setDefaultUncaughtExceptionHandler() 它设置当线程由于未捕获的异常突然终止时调用的默认处理程序。
您知道吗

如何通过两个线程执行两项任务?
如何通过匿名类执行多线程处理?
什么是线程调度程序?抢占式调度和时间分片有什么区别?
如果我们两次启动一个线程会发生什么?
如果我们调用run()方法而不是start()方法会怎样?
join方法的目的是什么?
如果没有剩余的用户线程,为什么JVM终止守护程序线程?
什么是垃圾回收?
finalize()方法的目的是什么?
gc()方法是什么?
什么是同步,为什么要使用同步?
同步方法和同步块有什么区别?
执行静态同步的两种方法是什么?
什么是死锁?何时会发生死锁?
什么是线程间通信或合作?

我们将在多线程中学到什么

多线程
线程的生命周期
创建线程的两种方法
如何通过多个线程执行多个任务
线程调度程序
休眠线程
我们可以启动一个线程两次吗?
如果我们调用run()方法而不是start()方法会怎样?
加入线程
命名线程
线程的优先级
守护进程线程
ShutdownHook
垃圾收集
使用同步方法进行同步
同步块
静态同步
线程间通信

线程资料拓展

如何创建线程
命名线程和当前线程
线程优先级
Java守护线程程序
Java线程池
Java线程组
Java垃圾回收
Java Runtime类