Java多线程教程
java中的多线程是一个同时执行多个线程的进程。线程是一个轻量级的子进程,是最小的处理单元。多进程和多线程都用于实现多任务处理。
但是,一般使用多线程而不是多进程,这是因为线程使用共享内存区域。它们不分配单独的内存区域以节省内存,并且线程之间的上下文切换比进程花费的时间更少。
Java多线程主要用于游戏,动画等。
1. Java多线程的优点
(1)它不会阻塞用户,因为线程是独立的,可以同时执行多个操作。
(2)可以一起执行许多操作,因此可以节省时间。
(3)线程是独立的,因此如果在单个线程中发生异常,它不会影响其他线程。
2. 多任务处理
多任务处理是同时执行多个任务的过程。使用多任务来利用CPU,多任务处理可以通过两种方式实现:
基于进程的多任务处理(多进程)
基于线程的多任务处理(多线程)
2.1. 基于进程的多任务处理(多进程)
- 每个进程在内存中都有一个地址。 换句话说,每个进程分配一个单独的内存区域。
- 进程是重量级的。
- 进程之间的通信成本很高。
- 从一个进程切换到另一个进程需要一些时间来保存和加载寄存器,内存映射,更新列表等。
2.2. 基于线程的多任务处理(多线程)
- 线程共享相同的地址空间。
- 线程是轻量级的。
- 线程之间的通信成本很低。
注意:一次只执行一个线程。
Java Thread类
Java提供了Thread
类来实现线程编程。 Thread
类提供了在线程上创建和执行操作的构造函数和方法。 Thread
类扩展了Object
类并实现了Runnable
接口。
Java线程方法
编号 | 修辞符 | 方法 | 描述 |
---|---|---|---|
1 | void |
start() | 它用于开始执行线程。 |
2 | void |
run() | 它用于为线程执行操作。 |
3 | static void |
sleep() | 它会在指定的时间内休眠一个线程。 |
4 | static Thread |
currentThread() | 它返回对当前正在执行的线程对象的引用。 |
5 | void |
join() | 它等待线程死亡 |
6 | int |
getPriority() | 它返回线程的优先级。 |
7 | void |
setPriority() | 它设置改变线程的优先级。 |
8 | String |
getName() | 它返回线程的名称。 |
9 | void |
setName() | 它用于设置线程的名称。 |
10 | long |
getId() | 它返回线程的编号(id)。 |
11 | boolean |
isAlive() | 它测试线程是否存活。 |
12 | static void |
yield() | 它使当前正在执行的线程对象暂停并允许其他线程临时执行。 |
13 | void |
suspend() | 它用于挂起线程。 |
14 | void |
resume() | 它用于恢复挂起的线程。 |
15 | void |
stop() | 它用于停止线程。 |
16 | void |
destroy() | 它用于销毁线程组及其所有子组。 |
17 | boolean |
isDaemon() | 它测试该线程是否是一个守护程序线程。 |
18 | void |
setDaemon() | 它将线程标记为守护程序或用户线程。 |
19 | void |
interrupt() | 它会中断线程。 |
20 | boolean |
isinterrupted() | 它测试线程是否被中断。 |
21 | static boolean |
interrupted() | 它测试当前线程是否已被中断。 |
22 | static int |
activeCount() | 它返回当前线程的线程组中活动线程的数量。 |
23 | void |
checkAccess() | 它确定当前运行的线程是否具有修改线程的权限。 |
24 | static boolean |
holdLock() | 当且仅当当前线程在指定对象上保存监视器锁时,它才返回true 。 |
25 | static void |
dumpStack() | 它用于将当前线程的堆栈跟踪打印到标准错误流。 |
26 | StackTraceElement[] |
getStackTrace() | 它返回一个堆栈跟踪元素数组,表示线程的堆栈转储。 |
27 | static int |
enumerate() | 它用于将每个活动线程的线程组及其子组复制到指定的数组中。 |
28 | Thread.State |
getState() | 它用于返回线程的状态。 |
29 | ThreadGroup |
getThreadGroup() | 它用于返回此线程所属的线程组 |
30 | String |
toString() | 它用于返回此线程的字符串表示形式,包括线程的名称,优先级和线程组。 |
31 | void |
notify() | 它仅用于为等待指定对象的一个线程发出通知。 |
32 | void |
notifyAll() | 它用于向指定对象的所有等待线程发出通知。 |
33 | void |
setContextClassLoader() | 它为Thread 设置上下文ClassLoader 。 |
34 | ClassLoader |
getContextClassLoader() | 它返回线程的上下文ClassLoader 。 |
35 | static Thread.UncaughtExceptionHandler |
getDefaultUncaughtExceptionHandler() | 它返回由于未捕获的异常而导致线程突然终止时调用的默认处理程序。 |
36 | static void |
setDefaultUncaughtExceptionHandler() | 它设置当线程由于未捕获的异常而突然终止时调用的默认处理程序。 |
java中的线程是什么
线程是一个轻量级的子进程,是最小的处理单元。它是一个单独的执行路径。
线程是独立的。 如果在一个线程中发生异常,则不会影响其他线程。 它使用共享内存区域。
如上图所示,线程在进程内执行。线程之间存在上下文切换。 操作系统中可以有多个进程,一个进程可以有多个线程。
猿狮妹
2022-07-25
Java
多线程
多线程编程
编程课程
猿狮院
热门教程
1 Java多线程教程
java中的多线程是一个同时执行多个线程的进程。线程是一个轻量级的子进程,是最小的处理单元。 多进程和多线程都用于实现多任务处理。
2 Java两次启动线程
Java能否两次启动同一线程?答案是:不能 。启动线程后,永远不能再次启动。 如果这样做,则抛出IllegalThreadStateException。 在这种情况下,线程将运行一次,但第二次,它将抛出异常。通过下面的例子来理解它:package com.vcclass;public class TestThreadTwice1 extends Thread { public void run() { System.out.println(&qu...
3 命名线程和当前线程
Thread类提供了更改和获取线程名称的方法。默认情况下,每个线程都有一个名称,即thread-0,thread-1, ...等。 可以使用setName()方法更改线程的名称。 setName()和getName()方法的语法如下:public String getName() : 用于返回线程的名称。public void setName(String name): 用于更改线程的名称。命名线程的示例package com.vcclass;class TestM...
4 多线程执行多任务
如何通过多线程执行单个任务?如果必须由多个线程执行单个任务,则只有通过run()方法。例如:由多个线程执行单个任务的程序。package com.vcclass;class TestMultitasking1 extends Thread { public void run() { System.out.println("task one"); } public static void ma...
5 Java线程组
Java提供了一种在单个对象中组合多个线程的便捷方法。通过这种方式,通过单个方法调用暂停,恢复或中断线程组。 注意: 现在不推荐使用suspend(),resume()和stop()方法。Java线程组由java.lang.ThreadGroup类实现。ThreadGroup表示一组线程。 线程组还可以包括其他线程组。 线程组创建一个树,其中除初始线程组之外的每个线程组都具有父线程。允许线程访问有关其自己的线程组的信息,但它无法访问有关其线程组的父线程组或任何其他...
6 线程的生命周期(线程状态)
线程可以处于五种状态之一。 根据sun解释,线程生命周期在java中有以下几种状态:初始(NEW) ,运行(RUNNABLE),阻塞(BLOCKED),等待(WAITING),超时等待(TIMED_WAITING)和终止(TERMINATED)。java中线程的生命周期由JVM控制。 java线程状态如下:初始(NEW):新创建了一个线程对象,但还没有调用start()方法。运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种...
7 创建线程
创建一个线程有两种方法:通过扩展Thread类。通过实现Runnable接口。Thread类Thread类提供了在线程上创建和执行操作的构造函数和方法。Thread类扩展了Object类并实现了Runnable接口。常用的Thread类构造函数Thread()Thread(String name)Thread(Runnable r)Thread(Runnable r,String name)Thread类的常用方法:...
8 Java线程调度程序
java的线程调度程序是JVM的一部分,它决定应该运行哪个线程。无法保证线程调度程序将选择运行哪个可运行线程。一次只能有一个线程在一个进程中运行。线程调度程序主要使用抢占式或时间切片调度来调度线程。抢占式调度与时间分片的区别在抢占式调度下,优先级最高的任务一直执行,直到它进入等待或死亡状态或更高优先级的任务出现。 在时间切片下,任务执行预定义的一段时间,然后重新进入就绪任务池。 然后,调度程序根据优先级和其他因素确定接下来应执行的任务。...
9 Java线程睡眠
Thread类的sleep()方法用于在指定的时间内睡眠线程。java中sleep()方法的语法Thread类为睡眠线程提供了两种方法:public static void sleep(long miliseconds)throws InterruptedExceptionpublic static void sleep(long miliseconds, int nanos)throws InterruptedExceptionjava中的sleep方法示例...
10 线程直接调用run()方法而不是start()方法
如果直接调用run()方法而不是start()方法会怎么样?每个线程在一个单独的调用堆栈中启动。从主线程调用run()方法,run()方法进入当前调用堆栈而不是新调用堆栈的开头。参考示例代码:...