首页 > 编程语言 >Java创建线程的4种方式

Java创建线程的4种方式

时间:2023-01-22 16:12:09浏览次数:39  
标签:Java Thread thread ThreadDemo 创建 线程 new public pool

继承Thread类,重写run方法

Thread类实现了Runnable接口(只有一个没有返回值的run方法)。

public class ThreadDemo extends Thread {
    public ThreadDemo(String name) {
        super(name);
    }

    @Override
    public void run() {
        System.out.println(getName());
    }

    public static void main(String[] args) {
        ThreadDemo thread1 = new ThreadDemo("thread1");
        ThreadDemo thread2 = new ThreadDemo("thread2");
        thread1.start();
        thread2.start();
    }
}

运行结果

thread2
thread1

实现Runnable接口,重写run方法

相比于继承Thread类,通过同一个实现了Runnable接口的对象来构造Thread对象,可以避免单继承的缺陷和实现资源共享。

public class ThreadDemo implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }

    public static void main(String[] args) {
        ThreadDemo thread = new ThreadDemo();
        Thread thread1 = new Thread(thread, "thread1");
        Thread thread2 = new Thread(thread, "thread2");
        thread1.start();
        thread2.start();
    }
}

运行结果

thread1
thread2

实现Callable接口,重写call方法

Callable接口只有一个call方法。相比于run方法,有返回值,且返回值支持泛型,可以抛出异常,借助FutureTask类来获取返回结果。
针对Runnable或者Callable任务,Future接口支持判断任务是否完成、中断任务、获取任务执行结果(get方法阻塞直到任务返回结果),唯一实现类是FutureTask。
FutureTask实现了RunnableFuture接口,RunnableFuture接口继承了Runnable和Future接口。

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class ThreadDemo implements Callable<String> {
    @Override
    public String call() throws Exception {
        return "thread";
    }

    public static void main(String[] args) {
        ThreadDemo threadDemo = new ThreadDemo();
        FutureTask<String> futureTask = new FutureTask<>(threadDemo);
        new Thread(futureTask).start();

        String s = "";
        try {
            s = futureTask.get();
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }

        System.out.println(s);
    }
}

运行结果

thread

使用ThreadPoolExecutor来创建线程池

ThreadPoolExecutor实现了Executor接口。
使用线程池,降低资源消耗,提高响应速度,提高线程的可管理性。

基于初始容量为10的有界任务队列来创建核心容量为10、最大容量为20、线程存活时间为1分钟的线程池

import java.util.concurrent.*;

public class ThreadDemo implements Runnable {
    public static void main(String[] args) {
        BlockingQueue<Runnable> blockingQueue = new ArrayBlockingQueue<>(10);
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                10, 20, 1, TimeUnit.MINUTES, blockingQueue, Executors.defaultThreadFactory());

        for (int i = 0; i < 10; i++) {
            threadPoolExecutor.submit(new ThreadDemo());
        }
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
}

运行结果

pool-1-thread-2
pool-1-thread-6
pool-1-thread-3
pool-1-thread-9
pool-1-thread-1
pool-1-thread-4
pool-1-thread-7
pool-1-thread-5
pool-1-thread-8
pool-1-thread-10

 

标签:Java,Thread,thread,ThreadDemo,创建,线程,new,public,pool
From: https://www.cnblogs.com/WJQ2017/p/17064480.html

相关文章

  • JavaScript中的空值合并操作符【??】和可选链操作符【?.】的理解和使用
    参考:http://t.csdn.cn/5700Y??-空值合并操作符结构:eg:letres=num01??num02;??当左侧的变量为null或undefined的时,返回左侧num02否则返回自身num01(num01相当于nu......
  • 利用java来实现计算器的加减乘除
    packagebag; importjava.util.Scanner; publicclassDemo06{ publicstaticvoidmain(String[]args){ Scannersc=newScanner(System.in);System......
  • 跟我20天学Java:02-自动类型转换,表达式的自动类型转换,强制类型转换
    文章目录​​学习目标​​​​一、什么是自动类型转换,为什么要学习自动类型转换?​​​​总结​​​​二、表达式的自动类型转换​​​​总结​​​​三、强制转化类型​​​......
  • JavaScript 循环引用
    JavaScript中的循环引用是指两个或多个对象之间相互引用的情况。这种情况下,这些对象就不能被垃圾回收机制正常回收,会导致内存泄漏。循环引用通常发生在对象之间相互包含......
  • Java有关数组对象越界的问题?
    提问: 我写了一个房屋出租系统,里面有房主的姓名,电话,地址,房号id和出租状态请问一下,再新增房屋的时候,都先判断一下房屋够不够,如果不够,那就新增一个数组来进行扩容,但是扩容新......
  • HTML5 WEB SQL 无法创建数据表的问题
    不知是什么原因,反复试,最后发现是数据表的某一列的字段用的是'check',把它改了后,就一切顺利了:无法创建数据表:db.transaction(function (tx) {       ......
  • JavaScript学习笔记—数组
    1.描述数组也是一种复合数据类型,在数组中可以存储多个不同类型的数据数组中存储的是有序的数据,数组中的每个数据都有一个唯一的索引,可以通过索引来操作获取数据数组中......
  • JavaScript 内存管理及垃圾回收
    一、内存管理JavaScript是一种自动垃圾回收语言,这意味着JavaScript引擎会自动监测和清理无用的内存。JavaScript中的内存管理主要由JavaScript引擎负责,开发人员不......
  • 【学懂Java】(四)面向对象编程-5
    一.Object类Object类是所有类的父类,一个类如果没有使用extends显性的继承另外一个类,那么这个类就继承自Object类publicclassPerson{}//等同于publicclassPersonextends......
  • day21-多线程
    1.实现多线程1.1简单了解多线程【理解】是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,提升性能......