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线程的创建和常见方法的更多相关文章

  1. Java线程:创建与启动

    Java线程:创建与启动 一.定义线程   1.扩展java.lang.Thread类.   此类中有个run()方法,应该注意其用法: public void run() 如果该线程是使用独立的 R ...

  2. 漫谈并发编程(二):java线程的创建与基本控制

    java线程的创建 定义任务           在java中使用任务这个名词来表示一个线程控制流的代码段,用Runnable接口来标记一个任务,该接口的run方法为线程运行的代码段. public ...

  3. JAVA - 线程从创建到死亡的几种状态都有哪些?

    JAVA - 线程从创建到死亡的几种状态都有哪些? 新建( new ):新创建了一个线程对象. 可运行( runnable ):线程对象创建后,其他线程(比如 main 线程)调用了该对象 的 sta ...

  4. Java中字符串的一些常见方法

    1.Java中字符串的一些常见方法 /** * */ package com.you.model; /** * @author Administrator * @date 2014-02-24 */ ...

  5. 【JAVA并发第二篇】Java线程的创建与运行,线程状态与常用方法

    1.线程的创建与运行 (1).继承或直接使用Thread类 继承Thread类创建线程: /** * 主类 */ public class ThreadTest { public static voi ...

  6. java线程的简单实现及方法

    java线程: 线程是一个程序内部的顺序控制流. cpu实际上在一个时间点上,只执行一个.只不过我们把cpu分成了多个时间片,由于速度很快,我们看起来像是多个线程.. 就像你的时间分成几片,这样 整体 ...

  7. Java线程中yield与join方法的区别

    长期以来,多线程问题颇为受到面试官的青睐.虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用.之前,我讨论了一个w ...

  8. Java 线程的创建和启动

    Java 使用 Thread 类代表线程,所有的线程对象都必须是 Thread 类或其子类的实例.每个线程的作用是完成一定的任务,实际上就是执行一段程序流(一段顺序执行的代码). Java 使用线程执 ...

  9. Java线程状态切换以及核心方法

    1.Java线程状态 1.1 线程主要状态 ①初始(NEW):新创建了一个线程对象,但还没有调用start()方法.②运行(RUNNABLE):Java线程中将就绪(ready)和运行中(runnin ...

  10. Java线程之创建线程

    翻译自:https://www.journaldev.com/1016/java-thread-example 进程 进程是一个自包含的执行环境,它可以被看成一个程序或应用程序.然而一个应用程序本身包 ...

随机推荐

  1. jmeter如何产生批量数据?

    在使用jmeter时,若需要产生批量数据,可以通过连接数据库--执行相关sql进行操作,例如添加20条数据 步骤: 1.添加jdbc 数据库配置信息 2.添加循环控制器(循环次数20) 3.循环控制器 ...

  2. 2023NOIP A层联测10 T4 子序列

    2023NOIP A层联测10 T4 子序列 题面及数据范围 Ps:链接来自accoderOJ. 考场2小时才做完 T1,抱着试一试的心态看了 T4,然后想到做法了,调了 1 个多小时没调除了,赛后发 ...

  3. SQL Server数据表模糊查询(like用法)详解

    在SQL Server Management Studio (SSMS) 中,进行模糊查询主要是通过使用like操作符来实现的.like操作符用于在where语句中搜索列中具有指定模式的数据.我们在简 ...

  4. .NET静态代码编织——肉夹馍(Rougamo)5.0

    肉夹馍(https://github.com/inversionhourglass/Rougamo),一款编译时AOP组件.相比动态代理AOP需要在应用启动时进行初始化,编译时完成代码编织的肉夹馍减少 ...

  5. 记一次vsix安装异常

    vsix是vs扩展安装的包,里面包含了vs扩展功能的相关内容和元数据. 由于个人需求,我通过zip工具,对其中的许可文件进行了更新,将EULA.rtf替换为eula.txt.但在安装过程中报错,日志提 ...

  6. 深入聊聊async&Promise

    正文 最近在学习JavaScript里的async.await异步,对于其中的Promise状态以及背后的Js引擎实际运行状态不大理解且很感兴趣,因此花了一点时间仔细研究了一下. 从Example说起 ...

  7. 高中生入门学习c/c++指导

    一.c与c++关系 参考图示: 可见,c与c++的基本部分是相同的,会有一些小区别,不妨一起学.DEV-C++能支持C++和C语言编程 二.学习资料网站介绍 1.C语言初阶--手把手教零基础/新手入门 ...

  8. 配合 envoy 使用 Zipkin

    use zipkin in envoy document: https://www.envoyproxy.io/docs/envoy/latest/start/sandboxes/zipkin.htm ...

  9. CMake构建学习笔记19-OpenSSL库的构建

    1. 概述 OpenSSL是一个开源的加密工具包和库,主要实现了安全套接字层(SSL)和传输层安全(TLS)协议,以及各种加密算法.数字签名.消息摘要.加密证书等功能.这个库可以说是Web开发尤其是H ...

  10. postgres

    10.67 su - app  docker pull postgres:12.15  docker run -d --name pgsql12 -p 5432:5432 -e "POSTG ...