首页 > 编程语言 >JAVA创建线程的方式总结

JAVA创建线程的方式总结

时间:2023-05-01 16:34:05浏览次数:47  
标签:JAVA Thread 创建 start run 线程 new public

1. 继承Thread类
通过继承Thread类,并重写它的run方法,就可以创建一个线程。

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

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + ":Hello!");
    }

    public static void main(String[] args) {
        TestThread1 bob = new TestThread1("Bob");
        TestThread1 alice = new TestThread1("Alice");
        bob.start();
        alice.start();
    }
}
  • 首先定义一个类来继承Thread类,重写run方法。
  • 然后创建这个子类对象,并调用start方法启动线程。
    执行结果:
    image

2. 实现Runnable接口
通过实现Runnable ,并实现run方法

public class TestThread2 implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + ":Hello!");
    }

    public static void main(String[] args) {
        TestThread2 testThread = new TestThread2();

        new Thread(testThread, "Bob").start();
        new Thread(testThread, "Alice").start();
    }
}
  • 首先定义一个类实现 Runnable接口,并实现run方法。
  • 然后创建Runnable实现类对象,并把它作为target传入Thread的构造函数中
  • 最后调用start方法启动线程。

执行结果:
image

3.使用Callable和FutureTask创建多线程
使用Callable和FutureTask创建线程的步骤如下:

  1. 创建一个Callable接口的实现类,并实现其call()方法,编写异步执行的具体逻辑,可以有返回值
  2. 使用Callable实现类的实例构造一个FutureTask实例
  3. 使用FutrueTask实例作为Thread构造器的target入参,构造新的Thread线程实例
  4. 调用Thread实例的start()方法启动线程,启动新线程的run()方法并发执行
  5. 调用FutureTask对象的get()方法阻塞性地获取并发线程执行结果
import java.util.concurrent.*;

public class TestCallable {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        SingleCallable singleCallable = new SingleCallable();
        SingleCallable singleCallable1 = new SingleCallable();
        singleCallable1.flag = -1;

        FutureTask futureTask = new FutureTask(singleCallable);
        FutureTask futureTask1 = new FutureTask(singleCallable1);
        new Thread(futureTask).start();
        new Thread(futureTask1).start();
        System.err.println(futureTask.get());
        System.err.println(futureTask1.get());
    }
}

class SingleCallable implements Callable<Boolean> {
    int flag = 0;

    @Override
    public Boolean call() throws Exception {
        if (flag >= 0) {
            return true;
        } else {
            return false;
        }
    }
}

区别
Runnable的唯一抽象方法run()没有返回值,也没受检查异常的异常声明,Callable接口的call()有返回值,并且声明了受检查异常,功能更强

4. 线程池

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestThreadPool {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        executorService.execute(new Thread(new SingleThread()));
        executorService.execute(new Thread(new SingleThread()));
        executorService.execute(new Thread(new SingleThread()));

        executorService.shutdown();
    }
}

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

标签:JAVA,Thread,创建,start,run,线程,new,public
From: https://www.cnblogs.com/wwwgo/p/17352668.html

相关文章

  • 线程池监控方案
    5ycode某信贷cto,专注于java技术研究与应用,包括JVM、DDD、软件设计、源码阅读、以及经验分享9篇原创内容公众号读了Java线程池实现原理及其在美团业务中的实践后,我就想一个问题,如果让我去做这个线程池的监控,我该怎么做?要对线程池进行监控,首先得明白,我们监控线程池的目的是什么?监控......
  • java:输入一个字符串,在其中寻找长度最长的,不含重复字符的字符串,如果有多个长度相同的最
    publicclasstest2{publicstaticList<String>findLongestSubstring(Strings){List<String>result=newArrayList<>();intn=s.length();Map<Character,Integer>map=newHashMap<......
  • JavaSE大纲
    jdk8&9新特性Lambda表达式多线程IO流异常CollectionsListMapSet泛型可变参数Collection集合的使用StringBuffer&StringBuilder基本数据类型和字符串的相互转换装箱拆箱日期Arrays工具类&Object类静态内部类&字符串多态,构造方法接口继承封装抽象面向对象......
  • Java线程池中的四种拒绝策略
    CallerRunsPolicy:这是默认的拒绝策略,当线程池队列已满并且无法处理新任务时,将由提交任务的线程来执行该任务。这种策略可以降低新任务的流量,但也会增加提交任务的线程的负载。AbortPolicy:当线程池队列已满并且无法处理新任务时,将抛出RejectedExecutionException异常,阻止新任......
  • JAVA的Jdbc连接Access数据库
      Eclipse加入Access_JDBC30.jar:   程序如下:importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.Statement;publicclassconn{publicstaticStringconnct(){try{......
  • Java内部类与匿名类
    内部类定义:一个类的内部又完整的嵌套了另一个类结构,被嵌套的类就被我们称为内部类,嵌套内部类的类被我们称为外部类//外部类classOuter{ //内部类 classInner { }}packageInnerclass;//外部其他类publicclassc1{}classOuter{//属性private......
  • java 基础(5)在idea中对java程序打包运行
    第一步 第二步 第三步  src目录下 第四步   第五步:  ......
  • Java层序遍历打印二叉树(有Null值)
    publicclassSolution{publicstaticvoidmain(String[]args){Integer[]arr={3,9,20,null,null,15};//根据数组构造出二叉树TreeNodetreeNode=creatTreeNode(arr,0);//层序有Null值的打印二叉树printBin......
  • JavaScript相关
    Javascript基础​ JavaScript,是一门能够运行在浏览器上的脚本语言.简称JS.首先,Javascript这个名字的由来就很有意思,不少人认为Javascript和Java貌似很像.容易想象成Java的脚本.但其实不然,两者之间没有任何关系.纯粹是商业碰瓷.​ 那么既然JS是可以运行在浏览器上......
  • 线程安全
    1、前言 先看看下面的代码输出是什么:publicclassTestSyncimplementsRunnable{intb=100;synchronizedvoidm1()throwsInterruptedException{b=1000;Thread.sleep(500);//6System.out.println("b="+b);......