Java之多线程

简介: 前言:关于进程和线程这些不再多说 直接讲多线程 main方法相当于主线程 多线程就是开启多个线程 同步或异步执行

一、创建线程的三种方式


 1.继承Thread类重写run方法


 run方法里面写要执行的代码块

public class MyThread extends Thread{
    @Override
    public void run() {
        super.run();
    }
}


2.实现Runnable接口 Runnble只是一个任务 实现后 必须要让Thread来执行 创建Runnable实现类对象 把对象放在new Runnbale(参数) 调用start方法执行 Runnble相当于一个任务 而Thread相当于执行它


public class MyThread1 implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(i);
        }
    }
}
public class MyThread {
    public static void main(String[] args) {
        MyThread1 myThread1 = new MyThread1();
        Thread thread = new Thread(myThread1);
        thread.start();
    }
}

匿名Runnbale类 如果只使用一次 可以使用匿名内部类在Thread里


public class MyThread {
    public static void main(String[] args) {
        MyThread1 myThread1 = new MyThread1();
        Thread thread = new Thread(myThread1);
        thread.start();
    }
}


3.实现Callable接口 关于实现Callable暂时不讲


二、获取线程和修改线程名称


         获取线程ID和线程名称


         1.在Thread的子类调用this.getId()或this.getName()来获取ID和线程名称 但是这种方式缺点是:必须要继承Thread才能调用


         2.使用Thread.currenThread().getId和Thread.currenThread().getName()来获取ID和名称  推荐使用这种方式 不用继承Thread 直接可以使用


        修改线程名称


1.调用线程队形的setName()方法


2.使用线程子类构造方法赋值


public class MyThread {
    public static void main(String[] args) {
        Thread thread = new Thread("我的线程1");
        thread.setName("我的线程1");
    }
}

3、抢占式调度


     Java是抢占式调度 当多个线程执行的时候 每个线程都会去抢占CPU 而CPU会把时间平均分给每个线程时间(时间片) 当线程的时间片使用完后 又把CPU使用还回去 又给其他线程执行


4、Thread常见方法


常见方法


*休眠:


public static void sleep(long millis) 休眠程序 1000毫秒 == 1秒


*放弃


public static void yield()


当前线程主动放弃时间片 回到就绪状态 竞争下一次时间片


*加入:


public final void join()


允许其他线程加入到当前线程中


*优先级


线程对象.setPriority()


线程优先级1-10 默认为5 优先级越高 表示获取CPU机会越多



*守护线程


线程对象setDaemon(true)设置为守护线程


线程有两类:用户线程(前台线程)、守护线程(后台线程)


如果程序中所有前台线程都执行完毕了 后台线程会自动结束


垃圾回收器线程属于守护线程


5、同步线程


为什么要同步?


当多个线程执行一个类的时候 当线程抢到cpu执行 还没运行完 就被其他线程抢走了 这样多个线程对一个类的时候 数据会不统一 所以多个线程必须同步 使用synchronized


同步方式(1)


同步代码块:(把当前线程执行后 才可以解锁 执行其他线程)


Synchronized(临界资源对象){ //对临界资源对象加锁


//代码(原子操作)

public class MyThread1 implements Runnable{
    @Override
    public void run() {
        synchronized (this){
            for (int i = 0; i < 10; i++) {
                System.out.println(i);
            }
        }
    }
}

synchronize()参数里面放同步的参数 没有使用this可以


同步方式(2):


同步方法:synchronized 返回值类型 方法名称(形参列表0){ //对当前对象 (thsi)加锁


//代码(原子操作)


}


注:


只有拥有对象相互斥锁标记的线程 才能进入该对象加锁的同步方法中


线程退出同步方法时 会释放相应的互斥锁标记


6、线程通信

等待


public final void wait()


public final void wait(long timeout)


必须在对obj加索的同步代码块中 在一个线程中 调用obj.wait()时 此线程会释放


其拥有的锁标记 同时此线程阻塞在o的等待队列中 释放锁 进入等待队列


通知


public final void notify()


public final void notifyAll()



相关文章
|
3天前
|
存储 缓存 Java
java线程内存模型底层实现原理
java线程内存模型底层实现原理
java线程内存模型底层实现原理
|
8天前
|
缓存 Java 应用服务中间件
Java虚拟线程探究与性能解析
本文主要介绍了阿里云在Java-虚拟-线程任务中的新进展和技术细节。
|
5天前
|
Java 开发者
Java中的多线程基础与应用
【9月更文挑战第22天】在Java的世界中,多线程是一块基石,它支撑着现代并发编程的大厦。本文将深入浅出地介绍Java中多线程的基本概念、创建方法以及常见的应用场景,帮助读者理解并掌握这一核心技术。
|
1天前
|
Java 调度
Java-Thread多线程的使用
这篇文章介绍了Java中Thread类多线程的创建、使用、生命周期、状态以及线程同步和死锁的概念和处理方法。
Java-Thread多线程的使用
|
7天前
|
Java
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
21 7
|
6天前
|
Java 程序员
Java中的多线程基础与实践
【9月更文挑战第21天】本文旨在引导读者深入理解Java多线程的核心概念,通过生动的比喻和实例,揭示线程创建、同步机制以及常见并发工具类的使用。文章将带领读者从理论到实践,逐步掌握如何在Java中高效地运用多线程技术。
|
4天前
|
Java 调度 开发者
Java中的多线程编程:从基础到实践
本文旨在深入探讨Java多线程编程的核心概念和实际应用,通过浅显易懂的语言解释多线程的基本原理,并结合实例展示如何在Java中创建、控制和管理线程。我们将从简单的线程创建开始,逐步深入到线程同步、通信以及死锁问题的解决方案,最终通过具体的代码示例来加深理解。无论您是Java初学者还是希望提升多线程编程技能的开发者,本文都将为您提供有价值的见解和实用的技巧。
14 2
|
6天前
|
Java 数据处理
Java中的多线程编程:从基础到实践
本文旨在深入探讨Java中的多线程编程,涵盖其基本概念、创建方法、同步机制及实际应用。通过对多线程基础知识的介绍和具体示例的演示,希望帮助读者更好地理解和应用Java多线程编程,提高程序的效率和性能。
18 1
|
9天前
|
安全 Java 调度
Java 并发编程中的线程安全和性能优化
本文将深入探讨Java并发编程中的关键概念,包括线程安全、同步机制以及性能优化。我们将从基础入手,逐步解析高级技术,并通过实例展示如何在实际开发中应用这些知识。阅读完本文后,读者将对如何在多线程环境中编写高效且安全的Java代码有一个全面的了解。
|
1天前
|
Java 数据处理 调度
Java中的多线程编程:从基础到实践
本文深入探讨了Java中多线程编程的基本概念、实现方式及其在实际项目中的应用。首先,我们将了解什么是线程以及为何需要多线程编程。接着,文章将详细介绍如何在Java中创建和管理线程,包括继承Thread类、实现Runnable接口以及使用Executor框架等方法。此外,我们还将讨论线程同步和通信的问题,如互斥锁、信号量、条件变量等。最后,通过具体的示例展示了如何在实际项目中有效地利用多线程提高程序的性能和响应能力。