Java中的多线程

文章目录

Java中的多线程

一、引言

在Java中,多线程编程是一种常见的并发执行技术,它允许程序同时执行多个任务。多线程可以提高程序的效率和响应性,特别是在需要执行长时间运行的任务或多个任务时。本文将详细介绍Java中多线程的基本概念、创建方式以及一些常用的线程操作方法。

二、多线程的创建和启动

1、继承Thread类

创建多线程的一种方式是让自定义的类继承Thread类,并重写其run方法。这种方式简单直观,但存在单继承的局限性。

java 复制代码
class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if (i % 2 == 0) {
                System.out.println(Thread.currentThread().getName() + ": " + i);
            }
        }
    }
}

public class ThreadTest {
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        t1.start(); // 启动线程
    }
}

2、实现Runnable接口

另一种创建多线程的方式是实现Runnable接口,这种方式避免了单继承的局限性,并且更适合多个线程共享数据。

java 复制代码
class MyRunnable implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + " --> " + i);
        }
    }
}

public class RunnableTest {
    public static void main(String[] args) {
        Thread t1 = new Thread(new MyRunnable());
        t1.start(); // 启动线程
    }
}

三、线程的常用方法

1、currentThread()和getName()

currentThread()方法返回当前代码执行的线程对象,getName()方法用于获取当前线程的名字。

java 复制代码
Thread.currentThread().getName(); // 获取当前线程名

2、sleep()和yield()

sleep()方法让当前线程暂停执行指定的时间,而yield()方法则是让出当前线程的CPU执行权,允许其他线程执行。

java 复制代码
try {
    Thread.sleep(1000); // 暂停1秒
} catch (InterruptedException e) {
    e.printStackTrace();
}

Thread.yield(); // 让出CPU执行权

3、join()

join()方法用于等待一个线程终止。这在需要确保某个线程执行完毕后再继续执行主线程的情况下非常有用。

java 复制代码
Thread t2 = new Thread(new MyRunnable());
t2.start();
try {
    t2.join(); // 等待t2线程执行完毕
} catch (InterruptedException e) {
    e.printStackTrace();
}

四、线程优先级

线程优先级是一个整数,其值从Thread.MIN_PRIORITY(1)到Thread.MAX_PRIORITY(10)。默认情况下,线程的优先级是Thread.NORM_PRIORITY(5)。高优先级的线程更有可能被操作系统选中执行,但这并不保证高优先级线程会先于低优先级线程执行完毕。

java 复制代码
Thread t = new Thread(new MyRunnable());
t.setPriority(Thread.MAX_PRIORITY); // 设置最高优先级
t.start();

五、使用示例

下面是一个实际的多线程使用示例,模拟了两个线程交替打印数字的场景:

java 复制代码
public class Counter {
    private int count = 0;

    public void increment() {
        count++;
    }

    public int getCount() {
        return count;
    }
}

class ThreadA extends Thread {
    private Counter counter;

    public ThreadA(Counter counter) {
        this.counter = counter;
    }

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            counter.increment();
            System.out.println("A: " + counter.getCount());
        }
    }
}

class ThreadB extends Thread {
    private Counter counter;

    public ThreadB(Counter counter) {
        this.counter = counter;
    }

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            counter.increment();
            System.out.println("B: " + counter.getCount());
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Counter counter = new Counter();
        ThreadA threadA = new ThreadA(counter);
        ThreadB threadB = new ThreadB(counter);

        threadA.start();
        threadB.start();
    }
}

在这个示例中,Counter类用于计数,ThreadAThreadB是两个线程,它们共享同一个Counter实例,并交替执行以增加计数器的值。主方法main中创建了Counter对象和两个线程对象,并启动它们。这个示例展示了多线程在实际应用中的简单用法,以及如何共享资源(这里是Counter对象)。

六、总结

Java中的多线程编程是一个强大的工具,它可以帮助我们提高程序的效率和响应性。通过继承Thread类或实现Runnable接口,我们可以创建和管理线程。了解线程的常用方法和优先级设置,可以帮助我们更好地控制线程的行为和执行顺序。多线程编程也需要我们注意线程安全问题,避免数据竞争和死锁等问题。


版权声明:本博客内容为原创,转载请保留原文链接及作者信息。

参考文章

相关推荐
用户79117724235831 分钟前
黑马点评【基于redis实现共享session登录】
java·redis
网安INF5 分钟前
CVE-2023-25194源码分析与漏洞复现(Kafka JNDI注入)
java·web安全·网络安全·kafka·漏洞·jndi注入
程序员岳焱11 分钟前
Java 集合高级操作:反射实现多属性去重与分组
java·后端·编程语言
Dcs15 分钟前
CMS、G1、ZGC、Shenandoah 的全面对比
java
GISer_Jing29 分钟前
Three.js中AR实现详解并详细介绍基于图像标记模式AR生成的详细步骤
开发语言·javascript·ar
委婉待续32 分钟前
Qt的学习(一)
开发语言·qt·学习
笨笨马甲32 分钟前
Qt Quick Layout功能及架构
开发语言·qt
Dovis(誓平步青云)41 分钟前
探索C++标准模板库(STL):String接口的底层实现(下篇)
开发语言·c++·stl·string
海棠一号1 小时前
JAVA理论第五章-JVM
java·开发语言·jvm
eternal__day1 小时前
Spring Cloud 多机部署与负载均衡实战详解
java·spring boot·后端·spring cloud·负载均衡