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()



相关文章
|
12天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
3天前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
9天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
32 9
|
6天前
|
安全 Java 开发者
Java多线程编程中的常见问题与解决方案
本文深入探讨了Java多线程编程中常见的问题,包括线程安全问题、死锁、竞态条件等,并提供了相应的解决策略。文章首先介绍了多线程的基础知识,随后详细分析了每个问题的产生原因和典型场景,最后提出了实用的解决方案,旨在帮助开发者提高多线程程序的稳定性和性能。
|
12天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####
|
9天前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
12天前
|
Java
JAVA多线程通信:为何wait()与notify()如此重要?
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是实现线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件满足时被唤醒,从而确保数据一致性和同步。相比其他通信方式,如忙等待,这些方法更高效灵活。 示例代码展示了如何在生产者-消费者模型中使用这些方法实现线程间的协调和同步。
26 3
|
10天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
11天前
|
Java
java小知识—进程和线程
进程 进程是程序的一次执行过程,是系统运行的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程 线程,与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比
23 1
|
12天前
|
Java UED
Java中的多线程编程基础与实践
【10月更文挑战第35天】在Java的世界中,多线程是提升应用性能和响应性的利器。本文将深入浅出地介绍如何在Java中创建和管理线程,以及如何利用同步机制确保数据一致性。我们将从简单的“Hello, World!”线程示例出发,逐步探索线程池的高效使用,并讨论常见的多线程问题。无论你是Java新手还是希望深化理解,这篇文章都将为你打开多线程的大门。
下一篇
无影云桌面