【Java Web】—— 认识 线程与进程(下)

简介: 【Java Web】—— 认识 线程与进程(下)

多种创建线程的方式

java标准库提供了一个Thread类帮助我们实现线程

通过Thread 与 Runnable / lambda 方式创建的线程本质上没什么区别核心都是依靠thread类 ,但是细节上(站在耦合性的角度) 在使用Runnable和 Lambda创建的线程在run中没有涉及到Thread相关的内容, 这就意味着很容易把这些逻辑从线程中剥离出来,去搭配其他并发编程的方式来执行,也可能会容易改成不并发的方式去执行


多线程的方式:

Thread类 与 Runnable接口

public class ThreadTest3 {
    static class MyThread extends Thread {
        @Override
        public void run() {
            System.out.println("hello");
        }
    }

static class MyRunnable implements Runnable {

    @Override
    public void run() {
        System.out.println("hello");
    }
}
public static void main(String[] args) {

    //1定义一个类继承Thread
    Thread t = new MyThread();
    t.start();

    //2定义匿名内部类
    Thread t1 = new Thread() {
        @Override
        public void run() {
            System.out.println("hello");
        }
    };
    t1.start();

    //3 lambda表达式
    Thread t2 = new Thread(() -> {
        System.out.println("hello");
    });
    t2.start();

    //4定义一个类继续Runnable接口,但注意要将runnable对象关联到Thread对象上
    Runnable r1 = new MyRunnable();
    Thread t3 = new Thread(r1);
    t3.start();

    //5匿名内部类继续Runnable接口
    Runnable r2 = new Runnable() {
        @Override
        public void run() {
            System.out.println("hello");
        }
    };
    Thread t4 = new Thread(r2);
    t4.start();

    //6对Runnable进行Lambda表达式
    Runnable r3 = () -> {
        System.out.println("hello");
    };
    Thread t5 = new Thread(r3);
    t5.start();

}
}

使用Callable/Future/FutureTask创建线程

  • FutureTask是继承于Future的 所以使用FutureTask和Callable可以创建一个带返回值得多线程结果
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class Demo {

    static class MyThread implements Callable<String> {

        private int ticket = 10;
        @Override
        public String call() throws Exception {
            while (this.ticket > 0) {
                System.out.println("余票为:" + this.ticket--);
            }
            return "票空";
        }
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        FutureTask<String> task = new FutureTask<>(new MyThread());
        Thread thread = new Thread(task);
        Thread thread1 = new Thread(task);
        thread.start();
        thread1.start();
        //get方法会阻塞 直到task运行结束
        System.out.println(task.get());

    }

}

多线程的优势-增加运行速度

public class ThreadTest2 {
    private static long count = 10_0000_0000;
    public static void main(String[] args) {
        Danxianc();
        Duoxianc();
    }

    private static void Danxianc() {
        long beg = System.currentTimeMillis();
        for (int i = 0; i < count; i++) {
            int a;
            a = i;
        }
        for (int i = 0; i < count; i++) {
            int b;
            b = i;
        }
        System.out.println(System.currentTimeMillis() - beg + "ms");
    }

    private static void Duoxianc() {
        long beg = System.currentTimeMillis();
        Thread thread = new Thread() {
            @Override
            public void run() {
                for (int i = 0; i < count; i++) {
                    int a;
                    a = i;
                }
            }
        };
        Thread thread1 = new Thread() {
            @Override
            public void run() {
                for (int i = 0; i < count; i++) {
                    int b;
                    b = i;
                }
            }
        };
        thread.start();
        thread1.start();
        //让方法这个线程等待,等thread 和thread1这两线程跑完自己再执行
        try {
            thread.join();
            thread1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(System.currentTimeMillis() - beg + "ms");
    }
}

运行结果:

1753ms
1044ms

目录
相关文章
|
2月前
|
Java 测试技术 API
【JUC】(1)带你重新认识进程与线程!!让你深层次了解线程运行的睡眠与打断!!
JUC是什么?你可以说它就是研究Java方面的并发过程。本篇是JUC专栏的第一章!带你了解并行与并发、线程与程序、线程的启动与休眠、打断和等待!全是干货!快快快!
542 2
|
2月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
196 1
|
2月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
221 1
|
3月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
422 0
|
3月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
|
3月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
416 1
Java 数据库 Spring
171 0
|
3月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
277 16
|
4月前
|
缓存 并行计算 安全
关于Java多线程详解
本文深入讲解Java多线程编程,涵盖基础概念、线程创建与管理、同步机制、并发工具类、线程池、线程安全集合、实战案例及常见问题解决方案,助你掌握高性能并发编程技巧,应对多线程开发中的挑战。
|
4月前
|
前端开发 Java 数据库
Java 项目实战从入门到精通 :Java Web 在线商城项目开发指南
本文介绍了一个基于Java Web的在线商城项目,涵盖技术方案与应用实例。项目采用Spring、Spring MVC和MyBatis框架,结合MySQL数据库,实现商品展示、购物车、用户注册登录等核心功能。通过Spring Boot快速搭建项目结构,使用JPA进行数据持久化,并通过Thymeleaf模板展示页面。项目结构清晰,适合Java Web初学者学习与拓展。
363 1