首页 > 编程语言 >Java多线程编程详解:从基础到高级

Java多线程编程详解:从基础到高级

时间:2024-08-01 20:41:58浏览次数:11  
标签:Java Thread void start 详解 线程 new 多线程 public

Java多线程编程详解:从基础到高级

大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!

Java的多线程编程允许程序同时执行多个任务,提高了应用的性能和响应能力。本文将从基础到高级,全面介绍Java中的多线程编程,包括线程的创建、线程池、同步机制及并发工具的使用。

1. 基础线程操作

1.1 创建线程

Java中创建线程有两种主要方法:继承Thread类和实现Runnable接口。

  • 继承Thread

    package cn.juwatech.example;
    
    public class MyThread extends Thread {
        @Override
        public void run() {
            System.out.println("Thread is running");
        }
    
        public static void main(String[] args) {
            MyThread thread = new MyThread();
            thread.start();
        }
    }
    
  • 实现Runnable接口

    package cn.juwatech.example;
    
    public class MyRunnable implements Runnable {
        @Override
        public void run() {
            System.out.println("Runnable is running");
        }
    
        public static void main(String[] args) {
            Thread thread = new Thread(new MyRunnable());
            thread.start();
        }
    }
    

1.2 线程生命周期

线程的生命周期包括以下状态:

  • 新建:线程被创建,但尚未启动。
  • 就绪:线程被启动,等待系统分配CPU时间。
  • 运行:线程正在执行。
  • 阻塞:线程等待某些资源,如I/O操作。
  • 终止:线程执行完毕或因异常终止。

1.3 线程优先级

Java允许设置线程优先级,优先级的范围从1(最低)到10(最高):

package cn.juwatech.example;

public class ThreadPriorityExample {
    public static void main(String[] args) {
        Thread thread1 = new Thread(() -> System.out.println("Thread 1"));
        Thread thread2 = new Thread(() -> System.out.println("Thread 2"));

        thread1.setPriority(Thread.MIN_PRIORITY); // 设置最低优先级
        thread2.setPriority(Thread.MAX_PRIORITY); // 设置最高优先级

        thread1.start();
        thread2.start();
    }
}

2. 线程同步

2.1 使用synchronized关键字

synchronized关键字用于保证同一时刻只有一个线程可以执行特定的代码块或方法,从而防止竞争条件:

  • 同步方法

    package cn.juwatech.example;
    
    public class SynchronizedMethod {
        private int count = 0;
    
        public synchronized void increment() {
            count++;
        }
    
        public static void main(String[] args) {
            SynchronizedMethod obj = new SynchronizedMethod();
            Thread t1 = new Thread(obj::increment);
            Thread t2 = new Thread(obj::increment);
    
            t1.start();
            t2.start();
        }
    }
    
  • 同步代码块

    package cn.juwatech.example;
    
    public class SynchronizedBlock {
        private int count = 0;
    
        public void increment() {
            synchronized (this) {
                count++;
            }
        }
    
        public static void main(String[] args) {
            SynchronizedBlock obj = new SynchronizedBlock();
            Thread t1 = new Thread(obj::increment);
            Thread t2 = new Thread(obj::increment);
    
            t1.start();
            t2.start();
        }
    }
    

2.2 锁机制

使用ReentrantLock类提供比synchronized更灵活的锁机制。支持尝试获取锁、定时锁和中断锁等功能:

package cn.juwatech.example;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockExample {
    private final Lock lock = new ReentrantLock();
    private int count = 0;

    public void increment() {
        lock.lock();
        try {
            count++;
        } finally {
            lock.unlock();
        }
    }

    public static void main(String[] args) {
        ReentrantLockExample obj = new ReentrantLockExample();
        Thread t1 = new Thread(obj::increment);
        Thread t2 = new Thread(obj::increment);

        t1.start();
        t2.start();
    }
}

3. 线程池

线程池是一种线程管理机制,允许重用现有的线程,减少了线程创建和销毁的开销。Java提供了Executors类用于创建线程池。

  • 创建线程池
    package cn.juwatech.example;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class ThreadPoolExample {
        public static void main(String[] args) {
            ExecutorService executor = Executors.newFixedThreadPool(3);
    
            for (int i = 0; i < 10; i++) {
                executor.execute(() -> {
                    System.out.println("Thread: " + Thread.currentThread().getName());
                });
            }
    
            executor.shutdown();
        }
    }
    

4. 高级并发工具

4.1 CallableFuture

Callable接口与Runnable类似,但可以返回结果并抛出异常。Future接口用于获取任务的执行结果。

  • 使用CallableFuture
    package cn.juwatech.example;
    
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Future;
    
    public class CallableFutureExample {
        public static void main(String[] args) {
            ExecutorService executor = Executors.newCachedThreadPool();
            Callable<Integer> task = () -> {
                Thread.sleep(1000);
                return 123;
            };
    
            Future<Integer> future = executor.submit(task);
    
            try {
                System.out.println("Result: " + future.get());
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
    
            executor.shutdown();
        }
    }
    

4.2 CountDownLatch

CountDownLatch允许一个或多个线程等待直到一组操作完成。

  • 使用CountDownLatch
    package cn.juwatech.example;
    
    import java.util.concurrent.CountDownLatch;
    
    public class CountDownLatchExample {
        public static void main(String[] args) {
            final CountDownLatch latch = new CountDownLatch(3);
    
            Runnable task = () -> {
                System.out.println(Thread.currentThread().getName() + " finished");
                latch.countDown();
            };
    
            new Thread(task).start();
            new Thread(task).start();
            new Thread(task).start();
    
            try {
                latch.await();
                System.out.println("All threads have finished");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    

4.3 Semaphore

Semaphore用于限制对某个资源的访问数量。

  • 使用Semaphore
    package cn.juwatech.example;
    
    import java.util.concurrent.Semaphore;
    
    public class SemaphoreExample {
        private static final Semaphore semaphore = new Semaphore(3);
    
        public static void main(String[] args) {
            Runnable task = () -> {
                try {
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName() + " acquired a permit");
                    Thread.sleep(2000);
                    System.out.println(Thread.currentThread().getName() + " released a permit");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    semaphore.release();
                }
            };
    
            for (int i = 0; i < 6; i++) {
                new Thread(task).start();
            }
        }
    }
    

4.4 CyclicBarrier

CyclicBarrier允许一组线程互相等待,直到所有线程都达到某个公共屏障点。

  • 使用CyclicBarrier
    package cn.juwatech.example;
    
    import java.util.concurrent.BrokenBarrierException;
    import java.util.concurrent.CyclicBarrier;
    
    public class CyclicBarrierExample {
        public static void main(String[] args) {
            final CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("Barrier is crossed"));
    
            Runnable task = () -> {
                try {
                    System.out.println(Thread.currentThread().getName() + " waiting at barrier");
                    barrier.await();
                    System.out.println(Thread.currentThread().getName() + " crossed the barrier");
                } catch (InterruptedException | BrokenBarrierException e) {
                    e.printStackTrace();
                }
            };
    
            new Thread(task).start();
            new Thread(task).start();
            new Thread(task).start();
        }
    }
    

本文著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!

标签:Java,Thread,void,start,详解,线程,new,多线程,public
From: https://www.cnblogs.com/szk123456/p/18337466

相关文章

  • Java串口编程:与硬件通信的实现
    Java串口编程:与硬件通信的实现大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!串口编程在与硬件设备通信时扮演着重要角色,尤其是在工业自动化、嵌入式系统和其他硬件设备的控制中。Java虽然在串口编程上并不直接支持,但通过第三方库(如JavaSerialPortAPI......
  • Java堆栈详解:内存管理与优化
    Java堆栈详解:内存管理与优化大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!Java的内存管理系统由堆(Heap)和栈(Stack)两部分组成,这些部分负责管理Java程序运行时的数据。理解Java堆栈的内存管理以及如何优化这些资源对于开发高效的Java应用至关重要。本文将......
  • Calendar类在Java中的使用与技巧
    Calendar类在Java中的使用与技巧大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!Calendar类是Java中处理日期和时间的重要工具。虽然Java8引入了更现代的java.time包,但Calendar类依然在许多现有项目中广泛使用。本文将介绍Calendar类的基本用法、常见技......
  • javascript学习 - 函数介绍
    函数简介编程时,可能会定义许多相同或者功能相似的代码,此时我们每需要使用一次,就需要重写编写一次。虽然利用循环结构也能够实现一些简单的重复操作,但是功能较为局限。此时,我们就需要使用到JavaScript中的函数。所谓函数,就是通过将一段可以重复调用的代码块进行封装,从而......
  • javascript学习 - 面向对象
    什么是对象之前学习的数据类型在存储一些复杂的信息时,十分不方便,而且也难以区分。为此,为了更加详细方便的描述某一个事物,因而提出面向对象的概念。那什么是对象呢?所谓对象,也是JavaScript中的一种数据类型,可以看做是一系列无序数据的集合。有了对象,就可以用来描述某一......
  • javascript学习 - 数组应用
    什么是数组之前的学习中,如果我们要存储一个值,一般都是通过变量来存储。但如果我们现在想要存储一系列的值,又该如何存储呢,你可能会说可以用多个变量来进行存储。这种方法也可以,但如果你想,一旦值过多,那岂不是就要多个变量,到时候管理就很混乱了。这时候就想,有没有一个可以存储......
  • javascript学习 - 流程控制
    一个程序中,各个代码之间的执行顺序对于程序结果是会造成影响的。就拿下面简单的例子来说,假如我们拿先使用num这个变量然后再定义和先定义变量再使用相比。先使用再定义会报错undefined,而定义再使用就没有问题。也就是说,代码的先后顺序会对我们的程序结果造成直接影响。c......
  • java中的值传递和引用传递
    值传递:传递对象的一个副本,即使副本被改变,也不会影响源对象,因为值传递的时候,实际上是将实参的值复制一份给形参。引用传递:传递的并不是实际的对象,而是对象的引用,外部对引用对象的改变也会反映到源对象上,因为引用传递的时候,实际上是将实参的地址值复制一份给形参。说明:对象传......
  • Mojo模块和包的概念详解
    Mojo提供了一个打包系统,可让您将代码库组织和编译库为可导入文件。本文介绍了关于如何将您的代码组织成模块和包的必要概念。并向您展示了如何使用命令行创建打包mojo的二进制包文件。Mojomodules了解Mojo软件包,首先需要了解Mojo模块。Mojo模块是一个Mojo源文件,其......
  • Kotlin 运算符详解:算术、赋值、比较与逻辑运算符全解析
    Kotlin运算符运算符用于对变量和值执行操作。值称为操作数,而操作符定义了要在两个操作数之间执行的操作:操作数运算符操作数100+50在下面的示例中,数字100和50是操作数,+号是运算符:示例varx=100+50虽然+运算符通常用于将两个值相加,如上例所示,但它也可以用......