【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

目录
相关文章
|
9天前
|
SQL Java
20:基于EL与JSTL的产品管理页-Java Web
20:基于EL与JSTL的产品管理页-Java Web
21 5
|
2天前
|
Java 调度
【Java多线程】对进程与线程的理解
【Java多线程】对进程与线程的理解
11 1
|
3天前
|
前端开发 JavaScript Java
Java与Web开发的结合:JSP与Servlet
Java与Web开发的结合:JSP与Servlet
8 0
|
9天前
|
设计模式 前端开发 Java
19:Web开发模式与MVC设计模式-Java Web
19:Web开发模式与MVC设计模式-Java Web
19 4
|
9天前
|
设计模式 存储 前端开发
18:JavaBean简介及其在表单处理与DAO设计模式中的应用-Java Web
18:JavaBean简介及其在表单处理与DAO设计模式中的应用-Java Web
24 4
|
9天前
|
SQL Java 数据库连接
17:数据库连接池与Servlet整合-Java Web
17:数据库连接池与Servlet整合-Java Web
21 3
|
9天前
|
存储 前端开发 搜索推荐
13:Session机制实现用户登录与注销功能-Java Web
13:Session机制实现用户登录与注销功能-Java Web
24 3
|
9天前
|
XML 前端开发 Oracle
16:JSP简介、注释与Scriptlet、Page指令元素、Include操作、内置对象、四种属性-Java Web
16:JSP简介、注释与Scriptlet、Page指令元素、Include操作、内置对象、四种属性-Java Web
12 2
|
9天前
|
缓存 前端开发 Java
15:Servlet 3.0文件上传与下载-Java Web
15:Servlet 3.0文件上传与下载-Java Web
23 5
|
2天前
|
设计模式 消息中间件 安全
【Java多线程】关于多线程的一些案例 —— 单例模式中的饿汉模式和懒汉模式以及阻塞队列
【Java多线程】关于多线程的一些案例 —— 单例模式中的饿汉模式和懒汉模式以及阻塞队列
9 0