java 线程详解及线程与进程的区别

Java 线程详解及线程与进程的区别

线程和进程的概念

在操作系统中,进程可以被看作是一个执行中的程序,它所占用的内存空间中包含了代码,数据,和系统资源等等。而线程则是进程中的执行单元,进程中可以拥有多个线程。

线程与进程的两个最重要的区别如下:

  • 一个进程可以有多个线程,各个线程可以并发执行
  • 一个进程内的线程共享该进程所占用的资源

Java 线程的创建和启动

Java 中的线程可以通过 Thread 类来创建和启动。以下为线程的创建和启动示例代码:

public class ThreadExample extends Thread {
    public void run() {
        System.out.println("线程运行中");
    }

    public static void main(String[] args) {
        ThreadExample thread = new ThreadExample();
        thread.start();
    }
}

上述代码中,我们先创建了一个继承自 Thread 的线程类 ThreadExample,然后在该线程类中实现了 run 方法。在 run 方法中,我们打印了一句话“线程运行中”。

在 main 方法中,我们创建了一个 ThreadExample 类型的对象 thread,然后通过调用 thread.start() 方法来启动线程。

Java 线程的状态

在 Java 中,线程一共有六种状态:

  • NEW:新创建的线程状态,线程还未启动
  • RUNNABLE:运行中的线程状态,线程正在执行或等待系统资源,例如 CPU 时间片
  • BLOCKED:阻塞中的线程状态,线程正在等待锁的时候被挂起
  • WAITING:等待中的线程状态,线程在等待另一个线程释放锁以及等待输入输出之类的操作
  • TIMED_WAITING:具有时间限制的等待中线程状态,线程在等待另一个线程释放锁或等待超时
  • TERMINATED:已结束的线程状态,线程已经执行完毕并终止

Java 线程的同步

Java 中的线程同步可以使用 synchronized 关键字来实现。以下为同步示例代码:

public class SynchronizedExample implements Runnable {
    private int num = 0;

    public synchronized void synchronizedMethod() {
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName() + " synchronized num:" + num++);
        }
    }

    public void run() {
        String threadName = Thread.currentThread().getName();
        if (threadName.equals("A")) {
            synchronizedMethod();
        }
    }

    public static void main(String[] args) {
        SynchronizedExample runnable = new SynchronizedExample();
        Thread threadA = new Thread(runnable, "A");
        Thread threadB = new Thread(runnable, "B");
        threadA.start();
        threadB.start();
    }
}

上述代码中,我们创建了一个 SynchronizedExample 类型的对象 runnable,并且创建了两个线程 threadA 和 threadB,并且他们执行的是同一个 runnable 对象上的 run 方法。

在 synchronizedMethod 方法中,我们使用 synchronized 关键字来实现了线程同步,让线程 A 和线程 B 能够依次执行。

Java 线程的异常处理

在开发 Java 线程的时候,我们同样需要考虑异常处理。Java 中线程中出现的异常可以通过 UncaughtExceptionHandler 接口来捕捉处理。以下为异常处理示例代码:

public class ExceptionHandlerExample implements Runnable {
    @Override
    public void run() {
        System.out.println(1 / 0);
    }

    public static void main(String[] args) {
        ExceptionHandlerExample runnable = new ExceptionHandlerExample();
        Thread thread = new Thread(runnable);
        thread.setUncaughtExceptionHandler(new ExceptionHandler());
        thread.start();
    }
}

class ExceptionHandler implements Thread.UncaughtExceptionHandler {
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.out.println(t.getName() + "发生了异常:" + e);
    }
}

在上述代码中,我们创建了一个 ExceptionHandlerExample 类型的对象 runnable,并且创建了一个线程 thread 来运行该对象上的 run 方法。然后我们通过调用 thread.setUncaughtExceptionHandler 方法为该线程设置了异常处理器。

在 ExceptionHandler 类中,我们实现了 UncaughtExceptionHandler 接口来定义了线程异常的处理逻辑。在 uncaughtException 方法中,我们打印了异常信息。

Java 线程池

在 Java 中,线程池可以使用 java.util.concurrent.Executors 工厂类来创建。以下为线程池示例代码:

public class ThreadPoolExample implements Runnable {
    public void run() {
        System.out.println(Thread.currentThread().getName() + "在运行");
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        ExecutorService pool = Executors.newFixedThreadPool(2);
        ThreadPoolExample instance = new ThreadPoolExample();
        pool.execute(instance);
        pool.execute(instance);
        pool.execute(instance);
        pool.execute(instance);
        pool.execute(instance);
        pool.shutdown();
    }
}

在上述代码中,我们创建了一个 ThreadPoolExample 类型的对象 instance,并且创建了一个线程池 pool 来运行该对象上的 run 方法。在 main 方法中,我们使用 ExecutorService 类型的变量 pool 调用 Executors 的 newFixedThreadPool 方法来创建一个大小为 2 的线程池。

然后我们使用 execute 方法来提交任务,每次执行都在声明一个 instance 线程对象。最后执行 pool.shutdown() 来关闭线程池。

以上为 Java 线程的基本介绍,希望对您理解 Java 线程有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java 线程详解及线程与进程的区别 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • SpringMVC高级开发功能实现过程解析

    下面我将为您详细讲解“SpringMVC高级开发功能实现过程解析”这个主题的完整攻略。 一、SpringMVC高级开发功能实现的准备工作 在进行SpringMVC高级开发功能的实现之前,首先需要对SpringMVC基础知识掌握熟练,包括控制器的编写、配置、映射、请求参数的获取、转发和重定向等。另外,还需要掌握Spring的Bean管理、AOP、事务处理等相关…

    Java 2023年5月16日
    00
  • Java基于解释器模式实现定义一种简单的语言功能示例

    Java基于解释器模式可以实现定义一种简单的语言功能,这里给出一个完整的攻略以及两条示例说明: 什么是解释器模式? 解释器模式是一种行为型设计模式,它用于定义语言的文法,并使用该文法来解释和执行语言中的语句。使用解释器模式时,我们需要定义语言的文法,然后编写解释器来解释和执行语言中的语句。 解释器模式的结构 解释器模式由以下几个部分组成: 抽象表达式(Abs…

    Java 2023年5月19日
    00
  • Java SpringMVC实现国际化整合案例分析(i18n)

    Java SpringMVC实现国际化整合案例分析(i18n) 国际化(Internationalization)是指将应用程序设计成可以适应不同的语言和文化环境。在Java SpringMVC中,我们可以使用国际化(i18n)来实现多语言支持。本文将详细讲解Java SpringMVC实现国际化整合的案例分析,并提供两个示例说明。 国际化的实现原理 在Ja…

    Java 2023年5月17日
    00
  • Java中的使用及连接Redis数据库(附源码)

    Java中的使用及连接Redis数据库 简介 Redis是一种开源的key-value型数据库,可以用作缓存、队列等。在Java中,通过使用Jedis客户端库可以连接Redis数据库,实现对数据库的操作。 依赖库引入 在使用Jedis之前,需要在pom.xml中引入依赖库: <dependency> <groupId>redis.cl…

    Java 2023年5月20日
    00
  • java代码实现C盘文件统计工具

    Java代码实现C盘文件统计工具 本攻略介绍如何使用Java编写一个C盘文件统计工具,可以计算C盘某个目录下的文件数量、目录数量、总大小等信息,并输出到控制台。 步骤一:创建Java项目 首先,打开Eclipse,在工作区中创建一个Java项目。 选择菜单栏中的 “File” –> “New” –> “Java Project”。 输入项目的…

    Java 2023年5月19日
    00
  • SpringBoot集成Spring Security的方法

    SpringBoot集成SpringSecurity的方法 Spring Security是一个强大的Java安全框架,可以提供身份验证、授权、加密和会话管理等功能。在本文中,将介绍如何使用SpringBoot集成Spring Security,以便在我们的应用程序中实现安全性。 步骤一:添加Spring Security依赖 我们需要在pom.xml文件中…

    Java 2023年5月15日
    00
  • 教你使用springboot配置多数据源

    使用SpringBoot配置多数据源,需要先在pom.xml文件中添加对jdbc和mysql-connector-java的依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-j…

    Java 2023年5月20日
    00
  • Java实现简单点餐系统

    下面来详细讲解如何用Java实现一个简单点餐系统。 步骤一:确定业务需求与功能 首先要明确此点餐系统需要实现哪些业务需求与功能,例如: 显示菜单列表 支持菜单搜索 展示菜品详细信息 选择菜品后加入订单 展示订单详情 取消订单 支付订单 这些需求与功能可以通过需求分析或与客户的沟通来确定。 步骤二:设计数据模型 接下来需要设计系统中用到的数据模型,例如: 菜品…

    Java 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部