java之多线程1

张开发
2026/4/17 8:26:15 15 分钟阅读

分享文章

java之多线程1
1.认识线程线程是什么一个线程就是一个 执行流 . 每个线程之间都可以按照顺序执行自己的代码 . 多个线程之间 同时 执行着多份代码。我们设想如下场景一家公司要去银行办理业务既要进行财务转账又要进行福利发放还得进行缴社保。如果只有张三一个会计就会忙不过来耗费的时间特别长。为了让业务更快的办理好张三又找来两位同事李四、王五一起来帮助他三个人分别负责一个事情分别申请一个号码进行排队自此就有了三个执行流共同完成任务但本质上他们都是为了办理一家公司的业务。此时我们就把这种情况称为多线程将一个大任务分解成不同小任务交给不同执行流就分别排队执行。其中李四、王五都是张三叫来的所以张三一般被称为主线程Main Thread而公司就相当于进程其中的员工属于线程为什么要有线程首先, 并发编程 成为 刚需。单核 CPU 的发展遇到了瓶颈. 要想提高算力, 就需要多核 CPU而并发编程能更充分利用多核 CPU资源。有些任务场景需要 等待 IO, 为了让等待 IO 的时间能够去做一些其他的工作, 也需要用到并发编程。其次, 虽然多进程也能实现并发编程, 但是线程比进程更轻量。线程是轻量级进程。创建线程比创建进程更快。销毁线程比销毁进程更快。调度线程比调度进程更快。进程和线程的区别进程是包含线程的每个进程至少有一个线程存在进程和进程之间不共享内存空间同一个进程的线程之间共享同一个内存空间进程是系统分配资源的最小单位线程是系统调度的最小单位。java中的主线程对于java中自带一个主线程main就是java的主线程在其里面的代码都是主线程中的任务2.创建线程创建线程有三种方法方法1——继承Thread类通过继承Thread类并重写run()方法来创建线程。class MyThread extends Thread {Overridepublic void run() {System.out.println(Thread is running (Thread Class));System.out.println(Thread name: Thread.currentThread().getName());}}public class Main {public static void main(String[] args) {Thread thread new MyThread();thread.start(); // 启动线程}}方法2——实现Runnable接口class MyRunnable implements Runnable {Overridepublic void run() {System.out.println(Thread is running (Runnable));System.out.println(Thread name: Thread.currentThread().getName());}}public class Main {public static void main(String[] args) {Thread thread new Thread(new MyRunnable());thread.start(); // 启动线程}}在讲完这两个方法后我们发现run和start两个重要方法那么它们是干什么的run里面用于描述线程干什么任务通过 start 去创建线程而后执行该任务。start是Thread中自带的方法,通俗的来说run方法记录这个事情,而strat就是要执行run里面的事情如果不去调用start直接调用run的话就没有创建出新的线程就是在主线程中执行run任务。方法三——使用匿名内部类创建线程实际上还是方法一和方法二的描述简化了代码罢了public class Main {public static void main(String[] args) {// 使用匿名内部类继承 ThreadThread thread new Thread() {Overridepublic void run() {System.out.println(Thread is running (Thread - Anonymous Inner Class));System.out.println(Thread name: Thread.currentThread().getName());}};// 启动线程thread.start();}}public class Main {public static void main(String[] args) {// 使用匿名内部类实现 RunnableRunnable runnable new Runnable() {Overridepublic void run() {System.out.println(Thread is running (Runnable - Anonymous Inner Class));System.out.println(Thread name: Thread.currentThread().getName());}};// 创建线程并启动Thread thread new Thread(runnable);thread.start();}}3.Thread类及常见方法Thread类的概念我们在前面看到了线程的创建需要Thread类那么Thread类到底是什么呢Thread 类是 JVM 用来管理线程的一个类换句话说每个线程都有一个唯一的 Thread 对象与之关联。每个执行流也需要有一个对象来描述而 Thread 类的对象就是用来描述一个线程执行流的JVM 会将这些 Thread 对象组织起来用于线程调度线程管理Thread 的常见构造方法常见属性说明ID 是线程的唯一标识不同线程不会重复这里的id和pcb的id是不同的是jvm自己搞的一套体系Java代码也无法获取到pcb的id关于后台线程需要记住一点JVM会在一个进程的所有前台线程结束后才会结束运行。而后台线程无论结束还是不结束都不影响jvm结束运行在 java 代码中, main 线程, 就是前台线程另外程序员创建出来的线程,默认情况下都是 前台线程.可以通过上述 setDaemon 方法来把线程设置为后台线程在 jconsole 中看到的 jvm 中包含一些其他的内置的线程, 就属于后台线程。我不期望这个线程影响JVM的结束就设为后台线程举个例子比如,有的线程负责进行 gc. (垃圾回收)gc 是要周期性持续性执行的.不可能主动结束要是把他设为前台,进程就永远也结束不了是否存活很直白的意思就是线程是否还存在是否被中断isInterrupted这个属性之后在中断会讲到这里先打个哑谜。

更多文章