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

Java创建线程的三种方式

更新时间:2022-09-05 11:11:54 来源:动力节点 浏览806次

Java创建线程的方式有哪些?动力节点小编来给大家介绍三种Java创建线程的方式。

1.继承Thread类

步骤:

a.创建一个类继承Thread,并重写run()方法,run()方法体为线程要执行的任务。

b.创建该类的实例对象,即创建了线程对象。

c.调用star()方法来启动线程

public class TestThread extends Thread {
private int i = 0;
@Override
public void run() {
for (; i < 10; i++) {
System.out.println(this.getName() + " " + i);
}
}
public static void main(String[] args) {
for (int j = 0; j < 20; j++) {
// 设置线程名称
Thread.currentThread().setName("主线程");
// 获取当前线程
System.out.println(Thread.currentThread().getName() + " " + j);
if (j == 5) {
// 创建第一个线程
new TestThread().start();
// 创建第二个线程
new TestThread().start();
}
}
}
}

运行结果

2.实现Runnable接口

步骤:

a.定义Runnable接口的实现类,重写run()方法,run()方法体为线程要执行的任务。

b.创建Runnable实现类的实例对象,将tr作为Thread对象的target创建并启动新线程。

c.调用star()方法来启动线程。

public class TestRunnable implements Runnable {
private int i = 0;
@Override
public void run() {
for (; i < 10; i++) {
// 实现Runnable接口 只能通过Thread.currentThread().getName()获取线程名称
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
public static void main(String[] args) {
for (int j = 0; j < 20; j++) {
// 获取当前线程
System.out.println(Thread.currentThread().getName() + " " + j);
if (j == 5) {
TestRunnable tr = new TestRunnable();
// 通过new Thread(Runnable target, String name)方式创建
new Thread(tr, "线程1").start();
new Thread(tr, "线程2").start();
}
}
}
}

运行结果

3.通过Callable和Future接口创建

步骤:

a.创建Callable接口的实现类,实现call()方法,call()方法作为线程执行体,并且有返回值。

b.创建Callable实现类的实例对象,使用FutureTask类来包装Callable对象。

c.使用FutureTask对象作为Thread对象的target创建并启动新线程。

d.调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。

public class CallableTest implements Callable<Integer> {
@Override
public Integer call() throws Exception {
int i = 0;
for (; i < 10; i++) {
// 实现Runnable接口 只能通过Thread.currentThread().getName()获取线程名称
System.out.println(Thread.currentThread().getName() + "循环变量 " + i);
}
return i;
}
public static void main(String[] args) {
CallableTest test = new CallableTest();
FutureTask<Integer> ft = new FutureTask<Integer>(test);
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
if (i == 5) {
new Thread(ft, "有返回的线程").start();
}
}
try {
System.out.println("子线程的返回值:" + ft.get());
} catch (InterruptedException | ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//java8支持用Lambda表达式创建Callable对象
public class CallableTest2 {
public static void main(String[] args) {
FutureTask<Integer> ft = new FutureTask<Integer>((Callable<Integer>) () -> {
int i = 0;
for (; i < 20; i++) {
System.out.println(Thread.currentThread().getName() + "循环变量" + i);
}
return i;
});
for (int j = 0; j < 20; j++) {
System.out.println(Thread.currentThread().getName() + " " + j);
if (j == 5) {
new Thread(ft, "有返回值的线程").start();
}
}
try {
System.out.println("子线程的返回值:" + ft.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}

运行结果

以上就是关于“Java创建线程的三种方式”的介绍,大家如果想了解更多相关知识,可以关注一下动力节点的Java多线程编程,里面还有更丰富的知识等着大家去学习,希望对大家能够有所帮助哦。

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

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