首页 > 其他分享 >创建和运行线程

创建和运行线程

时间:2022-10-25 09:12:04浏览次数:46  
标签:Runnable run Thread 创建 t2 线程 new 运行

方法一:直接使用 Thread

// 创建线程对象
Thread t = new Thread() {
    public void run() {
        // 要执行的任务
    }
};
// 启动线程
t.start()

例如

// 构造方法的参数是给线程指定名字,推荐
Thread t1 = new Thread("t1") {
    @Override
    // run 方法内实现了要执行的任务
    public void run() {
        log.debug("hello");
    }
};
t1.start();
输出 19:19:00 [t1] c.ThreadStarter - hello

方法二:使用 Runnable 配合 Thread

把【线程】和【任务】(要执行的代码)分开

  • Thread 代表线程
  • Runnable 可运行的任务(线程要执行的代码)
Runnable runnable = new Runnable() {
    public void run(){
        // 要执行的任务
    }
};
// 创建线程对象
Thread t = new Thread( runnable );
// 启动线程
t.start();

例如

// 创建任务对象
Runnable task2 = new Runnable() {
    @Override
    public void run() {
        log.debug("hello");
    }
};

// 参数1 是任务对象; 参数2 是线程名字,推荐
Thread t2 = new Thread(task2, "t2");
t2.start();
输出 19:19:00 [t2] c.ThreadStarter - hello

方法三:java 8 精简代码

Java 8 以后可以使用 lambda 精简代码

// 创建任务对象
Runnable task2 = () -> log.debug("hello");

// 参数1 是任务对象; 参数2 是线程名字,推荐
Thread t2 = new Thread(task2, "t2");
t2.start();

原理之 Thread Runnable 的关系

  • 分析 Thread 的源码,理清它与 Runnable 的关系
private Runnable target;

@Override
public void run() {
    if (target != null) {
        target.run();
    }
}

小结

  • 方法1 是把线程和任务合并在了一起,方法2 是把线程和任务分开了
  • 用 Runnable 更容易与线程池等高级 API 配合
  • 用 Runnable 让任务类脱离了 Thread 继承体系,更灵活

方法四:FutureTask 配合 Thread

FutureTask 能够接收 Callable 类型的参数,用来处理有返回结果的情况

// 创建任务对象
FutureTask<Integer> task3 = new FutureTask<>(() -> {
    log.debug("hello");
    return 100;
});

// 参数1 是任务对象; 参数2 是线程名字,推荐
new Thread(task3, "t3").start();

// 主线程阻塞,同步等待 task 执行完毕的结果
Integer result = task3.get();
log.debug("结果是:{}", result);

输出

19:22:27 [t3] c.ThreadStarter - hello
19:22:27 [main] c.ThreadStarter - 结果是:100

标签:Runnable,run,Thread,创建,t2,线程,new,运行
From: https://www.cnblogs.com/LoveBB/p/16823772.html

相关文章

  • Java多线程(3):ThreadPool(中)
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 线程池是个神器,用得好会非常地方便。本来觉得线程池的构造器有些复杂,即使讲清楚了对今后的用处可能也不太大,因为有一些J......
  • 多线程
    多线程线程创建--继承Thread类不推荐使用:避免OOP单继承局限性packagecom.beijing.xiaowen.multithreading;//创建线程方式一:继承Thread类,重写run方法,调用start开启......
  • java使用线程池实现多线程
    packageA_ShangGuiGu.Thread.ThreadTest;importjava.util.concurrent.*;/***创建线程的方式四:使用线程池。*线程池的好处:*1.提高响应速度(减少了创建线程的时间)*......
  • 创建线程的方式三:实现Callable接口
    packageA_ShangGuiGu.Thread.ThreadTest;importjava.util.concurrent.Callable;importjava.util.concurrent.ExecutionException;importjava.util.concurrent.FutureTa......
  • javascript编程单线程之同步模式
    javascript编程单线程之同步模式主流的js环境都是单线程吗模式执行js代码,js采用为单线程的原因与最开始设计初衷有关,最早是运行在浏览器端的脚本语言,目的是为了实现页......
  • 并发编程之线程池
    线程池为什么需要线程池?如果性能允许的话,我们完全可以在for循环代码起很多的线程去帮我们执行任务,代码如下publicclassManyThread{publicstaticvoidmain(S......
  • [FAQ] 如何从 svg 字符串创建 SVGElement
     HTML部分:<divstyle="display:none"id="svgCon"></div>JS部分:constsvgCon=document.getElementById('svgCon')svgCon.innerHTML='<svg>xxxxx';consts......
  • TCP进程与线程的区别
    1、进程和线程的区别:答:线程是指进程内的一个执行单元,也是进程内的可调度实体。与进程的区别:(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位。(2)......
  • JVM中的进程和线程
    JVM中的进程和线程介绍一个进程可以有很多个线程,进程之间基本上都是独立的,但是同一进程中的不同线程很可能会相互影响。每个线程有自己的程序计数器、虚拟机栈和本地方......
  • 【JS设计模式笔记】给我一张名片-工厂方法模式(创建型)
    广告展现例如,关于计算机培训广告资源需要投放,一批是Java的用绿色字体,一批是PHP的,用黄色字体,红色背景。//创建Java学科类varJava=function(content){ //将内容保......