Java线程的创建和常见方法
1.线程,进程和管程
1.1线程(Thread)
- 定义:线程是操作系统中能够独立运行的最小单位,是进程的一个执行分支。一个进程可以包含多个线程,它们共享同一进程的资源(如内存和文件句柄)。
- 特点:
- 线程之间的创建和销毁开销较小。
- 线程间共享内存,通信较为高效,但也容易引发竞争条件和数据不一致问题。
1.2进程(Process)
- 定义:进程是程序在计算机上运行的实例,它拥有自己的内存空间和资源。进程之间是相互独立的,通常通过进程间通信(IPC)进行数据交换。
- 特点:
- 进程有自己的地址空间,线程间不共享内存。
- 进程的创建和销毁开销较大,但提供更好的隔离性和稳定性。
1.3管程(Monitor)
- 定义:管程是一种高层次的同步机制,用于控制对共享资源的访问。它将共享资源的访问和管理封装在一个对象中,并提供互斥访问。
- 特点:
- 管程通常包括一个互斥锁和一些条件变量。
- 通过管程,可以避免线程间的竞争条件,简化线程同步的复杂性。
2.用户线程和守护线程
用户线程:系统的工作线程,会完成这个程序需要完成的业务操作。
守护线程:服务进程,没有服务对象就没有必要继续运行下去了,如果用户线程全部结束,意味着程序需要完成的业务操作已经结束,系统可以退出,当只剩下守护线程时,Java虚拟机会自动退出。
3.并发和并行
3.1并发(Concurrency)
- 定义:并发是指多个任务在同一时间段内进行,不一定是同时执行的。任务可能在共享的时间片上交替运行。
- 特点:
- 任务之间可以相互影响,可以在同一时间片上切换。
- 并发的实现可以通过多线程、异步编程等方式。
- 适用于需要同时处理多个任务的场景,但不一定能提高程序的执行速度。
3.2并行(Parallelism)
- 定义:并行是指多个任务在同一时刻同时执行。通常是在多核处理器上,多个任务可以同时在不同的核心上运行。
- 特点:
- 任务是独立的,可以同时进行,不需要相互干扰。
- 并行通常涉及到对任务的划分,能够有效利用多核处理器的资源。
- 适用于计算密集型任务,可以显著提高程序的执行速度。
4.创建线程的方式
4.1. 继承Thread类
通过继承Thread类并重写其run()方法来创建线程。然后实例化该类并调用start()方法启动线程,jvm自动调用run()方法。
class MyThread extends Thread {
@Override
public void run() {
System.out.println("Thread is running.");
}
}
MyThread thread = new MyThread();
thread.start();
4.2. 实现Runnable接口
通过实现Runnable接口并重写其run()方法,然后将该实现传递给Thread对象,再调用start()方法启动线程,jvm自动调用run()方法。
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("Thread is running.");
}
}
Thread thread = new Thread(new MyRunnable());
thread.start();
5.线程Thread的常见方法
5.1 开启线程
每个线程只能执行一次(如果直接运行run等同于对象调用方法 仍然是单线程)
thread.start();
5.2 当前线程
Thread currentThread = Thread.currentThread();
5.3 插队线程
当你在主线程中调用另一个线程的 join() 方法时,主线程会暂停执行进入阻塞状态,直到被调用的线程完成为止。这在需要确保某个线程在继续执行前已经完成时非常有用。
thread.join();
5.4 检查线程是否存活
boolean isAlive = thread.isAlive();
5.5 中断线程
thread.interrupt();
5.6 设置线程优先级
thread.setPriority(Thread.MAX_PRIORITY); // 设置为最大优先级
5.7 获取线程的名称和 ID
String name = thread.getName();
long id = thread.getId();
5.8 设置线程名称
thread.setName("MyThreadName");
5.9 线程休眠
Thread.sleep(1000); // 使当前线程休眠 1 秒
5.10 检查线程的状态
Thread.State state = thread.getState();
5.11 设置和获取线程优先级
thread.getPriority();
thread.setPriority();
5.12 设置为守护线程
thread.setDaemon(true);
5.13 让出CPU
下一次CPU既可能被子线程拿到,也可能又一次被主线程拿到
thread.yield();
Java线程的创建和常见方法的更多相关文章
- Java线程:创建与启动
Java线程:创建与启动 一.定义线程 1.扩展java.lang.Thread类. 此类中有个run()方法,应该注意其用法: public void run() 如果该线程是使用独立的 R ...
- 漫谈并发编程(二):java线程的创建与基本控制
java线程的创建 定义任务 在java中使用任务这个名词来表示一个线程控制流的代码段,用Runnable接口来标记一个任务,该接口的run方法为线程运行的代码段. public ...
- JAVA - 线程从创建到死亡的几种状态都有哪些?
JAVA - 线程从创建到死亡的几种状态都有哪些? 新建( new ):新创建了一个线程对象. 可运行( runnable ):线程对象创建后,其他线程(比如 main 线程)调用了该对象 的 sta ...
- Java中字符串的一些常见方法
1.Java中字符串的一些常见方法 /** * */ package com.you.model; /** * @author Administrator * @date 2014-02-24 */ ...
- 【JAVA并发第二篇】Java线程的创建与运行,线程状态与常用方法
1.线程的创建与运行 (1).继承或直接使用Thread类 继承Thread类创建线程: /** * 主类 */ public class ThreadTest { public static voi ...
- java线程的简单实现及方法
java线程: 线程是一个程序内部的顺序控制流. cpu实际上在一个时间点上,只执行一个.只不过我们把cpu分成了多个时间片,由于速度很快,我们看起来像是多个线程.. 就像你的时间分成几片,这样 整体 ...
- Java线程中yield与join方法的区别
长期以来,多线程问题颇为受到面试官的青睐.虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用.之前,我讨论了一个w ...
- Java 线程的创建和启动
Java 使用 Thread 类代表线程,所有的线程对象都必须是 Thread 类或其子类的实例.每个线程的作用是完成一定的任务,实际上就是执行一段程序流(一段顺序执行的代码). Java 使用线程执 ...
- Java线程状态切换以及核心方法
1.Java线程状态 1.1 线程主要状态 ①初始(NEW):新创建了一个线程对象,但还没有调用start()方法.②运行(RUNNABLE):Java线程中将就绪(ready)和运行中(runnin ...
- Java线程之创建线程
翻译自:https://www.journaldev.com/1016/java-thread-example 进程 进程是一个自包含的执行环境,它可以被看成一个程序或应用程序.然而一个应用程序本身包 ...
随机推荐
- btrace一些你不知道的事(源码入手)
背景 周五下班回家,在公司班车上觉得无聊,看了下btrace的源码(自己反编译). 一些关于btrace的基本内容,可以看下我早起的一篇记录:btrace记忆 上一篇主要介绍的是btrace的一些基本 ...
- 使用SwingWorker异步加载JTree
SwingWorker是Java SE 6.0新加入的一个工具包,利用它可以使长时间运行并更新用户界面的任务大大简化.本文以一个异步加载JTree的demo演示了SwingWorker的基本功能. 环 ...
- 抓包工具之Fiddler(详解)
Fiddle简介 Fiddler是最强大最好用的Web调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据,Fiddler包含了一个强大的基于 ...
- 使用conditional 实现线程精准通讯
实现3个线程之间依次执行 比如有3个线程A,B,C ,需要按照顺序执行,ABC,ABC 依次执行. 这个使用可以使用 Lock 的 conditional来实现线程之间精准通讯. 点击查看代码 pac ...
- InheritableThreadLocal 父子线程值传递
最近项目中使用 @Async 异步远程调用的时候,发现主线程能拿到 token 值,子线程调用的时候 token 为 null.研究了一番,发现可以直接使用 InheritableThreadLoca ...
- (系列十四)Vue3+WebApi 搭建动态菜单
说明 该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发). 该系统文章,我会尽量说的非常详细,做到不管新手.老手都能看懂. 说明:OverallAuth2 ...
- CCF中国开源大会,中电金信与行业共探AI技术在金融行业的应用和前景
10月21日,以"开源联合,聚力共赢"为主题的2023 CCF中国开源大会在长沙开幕.中电金信副总经理.研究院院长况文川参加峰会,在"算力与大模型"主题论坛 ...
- C#中 CancellationTokenSource的妙用
在.NET中,CancellationTokenSource.CancellationToken和Task是处理异步操作和取消任务的重要工具.本文将通过一些简单的例子,帮助你理解它们的用法和协作方式. ...
- 【人工智能】【Python】Anacond基础操作
# 001.在 Anaconda 中使用 Conda 管理 Python 环境 工具:Anaconda Prompt(Anaconda)| 请使用管理员权限运行 更新Anaconda conda up ...
- Qt/C++编写监控实时显示和取流回放工具(回放支持切换进度)
一.前言 现在各个监控大厂做的设备,基本上都会支持通过rtsp直接取流显示,而且做的比较好的还支持通过rtsp回放取流,基本上都会约定一个字符串的规则,每个厂家都是不一样的规则,比如回放对应的rtsp ...