专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 3种创建线程的方式

3种创建线程的方式

更新时间:2020-11-06 17:52:08 来源:动力节点 浏览946次

在 Java 中使用 Thread 类代表线程,所有的线程对象都必须是 Thread 类或者其子类的实例,因此,创建线程实际上就是创建Thread类。本文我们向大家介绍3种创建线程的方式,为我们后面学习多线程埋下伏笔。


在Java 中有3种创建线程方式,下面一一学习:

1. 继承 Thread 类

step 1 定义一个类继承自 Thread 类,然后重写该类的 run 方法,这个方法的内容表示线程要完成的任务

step 2 创建线程对象,即创建 Thread 类子类的实例

step 3 调用步骤二中创建出来的对象的 start 方法来启动线程

public class CreateThreadByExtendsThread extends Thread {

@Override

public void run() {

IntStream.rangeClosed(1, 10).forEach(i -> System.out.println(Thread.currentThread().getName() + " " + i));

}

public static void main(String[] args) {

CreateThreadByExtendsThread threadOne = new CreateThreadByExtendsThread();

CreateThreadByExtendsThread threadTwo = new CreateThreadByExtendsThread();

CreateThreadByExtendsThread threadThree = new CreateThreadByExtendsThread();

threadOne.start();

threadTwo.start();

threadThree.start();

}

}


2.实现 Runnable 接口

step 1 定义一个类实现 Runnable 接口,然后实现该接口的 run 方法,这个方法的内容同样也表示线程要完成的任务

step 2 创建 Runnable 接口实现类的实例,并使用该实例作为 Thraed 构造方法的参数创建 Thread 类的对象,该对象才是真正的线程对象

step 3 调用线程对象的 start 方法来启动该线程

public class CreateThreadByImplementsRunnable implements Runnable {

@Override

public void run() {

IntStream.rangeClosed(1, 10).forEach(i -> System.out.println(Thread.currentThread().getName() + " " + i));

}

public static void main(String[] args) {

CreateThreadByImplementsRunnable target = new CreateThreadByImplementsRunnable();

new Thread(target, "thread-one").start();

new Thread(target, "thread-two").start();

new Thread(target, "thread-three").start();

}

}


3. 实现 Callable 接口

step 1 定义一个类实现 Callable 接口,然后实现该接口的 call 方法,这个方法的内容同样也表示线程要完成的任务,并且有返回值

step 2 创建 Callable 接口实现类的实例,使用 FutureTask 类来包装 Callable 对象,该 FutureTask 对象封装了 Callable 对象的 call 方法的返回值

step 3 并使用 FutureTask 对象作为 Thraed 构造方法的参数创建 Thread 对象,并调用该对象的 start 方法启动线程

step 4 调用 FutureTask 对象的 get 方法获取线程执行结束后的返回值

public class CreateThreadByImplementsCallable implements Callable{

@Override

public Integer call() {

AtomicInteger count = new AtomicInteger();

IntStream.rangeClosed(0, 10).forEach(i -> {

System.out.println(Thread.currentThread().getName() + " " + i);

count.getAndIncrement();

});

return count.get();

}

public static void main(String[] args) {

CreateThreadByImplementsCallable target = new CreateThreadByImplementsCallable();

FutureTaskfutureTask = new FutureTask<>(target);

IntStream.rangeClosed(0, 10).forEach(i -> {

System.out.println(Thread.currentThread().getName() + " 的循环变量 i 的值" + i);

if (i == 8) {

new Thread(futureTask, "有返回值的线程").start();

}

});

try {

System.out.println("有返回值线程的返回值:" + futureTask.get());

} catch (InterruptedException | ExecutionException e) {

e.printStackTrace();

}

}

}


通过以上可以看出,其实通过实现 Runnable 接口和实现 Callable 接口这两种方式创建线程基本相同,采用实现 Runnable 和 Callable 接口的方式创建线程时,线程类只是实现接口,还可以继承其它类(PS:Java 单继承决定)。在这种方式下,多个线程可以共享同一个 target对象,所以非常适合多个相同线程来处理同一份资源的情况。还有一点就是,使用继承 Thread 类的方式创建多线程时,编写简单,如果需要访问当前线程,则无需使用 Thread.currentThread() 方法,直接使用 this 即可获得当前线程。


最后,3种创建线程的方式已全部讲完了,相信对于以上的内容有所了解和掌握吧,想要全方位学习Java多线程的小伙伴可以观看本站的Java多线程教程,里面对多线程的讲解很全面透彻,可以加深我们对多线程的理解。


提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>