java开启线程的四种方法

2025-08-28 00:37:44 世界杯外围赛

文章目录

1、继承Thread类

1.1 代码实现

1.2 测试结果

2、实现Runnable接口

2.1 方式一:直接实现Runnable接口

2.1.1 代码实现

2.1.2 测试结果

2.2 方式二:匿名内部类

2.2.1 代码实现

2.2.2 测试结果

3、实现Callable接口

3.1 代码实现

3.2 测试结果

4、创建线程池

4.1 代码实例

4.2 测试结果

1、继承Thread类

/*

* 创建步骤如下:

* 1,定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务。因此把run方法称为线程执行体。

* 2,创建Thread子类了的实例,即创建线程对象。本实例中是new一个ExtendThread,即可创建线程对象,也就是开启了一个线程

* 3,调用线程对象的start()方法来启动该线程。

*

* 调用示例:

* //循环10次即开启10个线程

* for (int i = 0; i < 10; i++) {

* ExtendThread extendThread = new ExtendThread();

* extendThread.start();

* }

* */

1.1 代码实现

package com.zyz.mynative.demo03;

/**

* @author zyz

* @version 1.0

* @data 2023/2/15 15:51

* @Description:继承Thread类,重写run方法(不推荐,因为java的单继承局限性)

*/

public class ExtendThread extends Thread {

public static void main(String[] args) {

ExtendThread thread = new ExtendThread();

thread.start();

}

/**

* 重写Thread类的run(),这个方法称为线程执行体

*/

@Override

public void run() {

doSomething();

}

/**

* 需要处理的任务

*/

public void doSomething() {

for (int i = 0; i < 10; i++) {

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

}

}

}

1.2 测试结果

2、实现Runnable接口

2.1 方式一:直接实现Runnable接口

避免单继承的局限性,方便共享资源,推荐使用

/*

* 创建步骤如下:

* 1,定义Runnable接口的实现类,并且实现run方法,这个方法同样是线程执行体

* 2,创建Runnable实现类的实例,并以此实例对象作为Thread的target来创建Thread类,这个新创建的Thread对象才是真正的线程对象,即开启了新的线程

* 3,调用线程对象的start()方法来开启该线程

*

* 调用示例:

* //开启10个线程

* for (int i = 0; i < 10; i++) {

* Thread thread = new Thread(new RunnableImpl());

* thread.start();

* }

* */

2.1.1 代码实现

package com.zyz.mynative.demo03;

/**

* @author zyz

* @version 1.0

* @data 2023/2/15 15:57

* @Description:

*/

public class RunnableImpl implements Runnable {

public static void main(String[] args) {

RunnableImpl runnable = new RunnableImpl();

Thread thread = new Thread(runnable);

thread.start();

/**

* 简写

* new Thread(runnable).start();

*/

}

/**

* 实现Runnable接口的run方法,这个方法称为线程执行体

* */

@Override

public void run() {

doSomething();

}

/**

* 需要处理的任务

* */

private void doSomething(){

for (int i = 0; i < 10; i++) {

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

}

}

}

2.1.2 测试结果

2.2 方式二:匿名内部类

/*

* 创建步骤如下:

* 匿名内部类本质上也是一个类实现了Runnable接口,重写了run方法,只不过这个类没有名字,直接作为参数传入Thread类

*

* 调用示例:

* //开启10个线程

* for (int i = 0; i < 10; i++) {

* Anonymous anonymous =new Anonymous();

* anonymous.myRun();

* }

*

* */

2.2.1 代码实现

package com.zyz.mynative.demo03;

/**

* @author zyz

* @version 1.0

* @data 2023/2/15 15:57

* @Description:

*/

public class RunnableImpl2 {

public static void main(String[] args) {

RunnableImpl2 test = new RunnableImpl2();

test.myRun();

}

public void myRun(){

new Thread(new Runnable() {

@Override

public void run() {

doSomething();

}

}).start();

}

/**

* 需要处理的任务

* */

private void doSomething(){

for (int i = 0; i < 10; i++) {

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

}

}

}

2.2.2 测试结果

3、实现Callable接口

/*

* 创建步骤如下:

* 1,定义实现Callable接口的实现类,实现call方法,这个方法是线程执行体

* 2,创建Callable实现类的实例,借助FutureTask得到线程执行的返回值

* 3,将FutureTask的实例,作为Thread的target来创建Thread类

* 4,调用start方法,开启线程

*

* 调用示例:

* Callable tc = new CallableImpl();

* FutureTask task = new FutureTask<>(tc);

* new Thread(task).start();

* try {

* System.out.println(task.get());

* } catch (InterruptedException | ExecutionException e) {

* e.printStackTrace();

* }

*

* 说明:

* 1.与使用Runnable相比, Callable功能更强大些

* 2.实现的call()方法相比run()方法,可以返回值

* 3.方法可以抛出异常

* 4.支持泛型的返回值

* 5.需要借助FutureTask类,比如获取返回结果

* Future接口可以对具体Runnable、Callable任务的执行结果进行取消、查询是否完成、获取结果等。

* FutureTask是Futrue接口的唯一的实现类

* FutureTask 同时实现了Runnable, Future接口。它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值

*

* */

3.1 代码实现

package com.zyz.mynative.demo03;

import java.util.concurrent.Callable;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.FutureTask;

/**

* @author zyz

* @version 1.0

* @data 2023/2/15 16:08

* @Description:

*/

public class CallableImpl implements Callable {

public static void main(String[] args) {

Callable tc = new CallableImpl();

FutureTask task = new FutureTask<>(tc);

new Thread(task).start();

try {

System.out.println(task.get());

} catch (InterruptedException | ExecutionException e) {

e.printStackTrace();

}

}

private int ticket = 5;

@Override

public String call() throws Exception {

for (int i = 0; i < 10; i++) {

System.out.println(doSomething());

}

return "出票任务完成";

}

public String doSomething() {

String result = "";

if (this.ticket > 0) {

result = "出票成功,ticket=" + this.ticket--;

} else {

result = "出票失败,ticket=" + this.ticket;

}

return result;

}

}

3.2 测试结果

4、创建线程池

/*

* 创建步骤如下:

* 1,定义Runnable接口的实现类,或者定义(继承Runnable接口的类)的实现类,并且实现run方法,这个方法是线程执行体

* 2,创建一个自定义线程个数的线程池

* 3,实例化Runnable接口的实现类

* 4,将3步的实例,作为线程池实例的execute方法的command参数,开启线程

* 5,关闭线程池

*

* 调用示例:

* ExecutorService pool = Executors.newFixedThreadPool(2);

* ThreadPool threadPool = new ThreadPool("AA");

* ThreadPool threadPoo2 = new ThreadPool("BB");

* pool.execute(threadPool);

* pool.execute(threadPoo2);

* pool.shutdown();

*

* 说明:

* 示例中创建的是2个线程的线程池

* execute方法是开启线程方法,实参要求是实现Runnable的类。所以,继承Thread类的子类也可以以线程池的方式开启线程

*

* */

4.1 代码实例

package com.zyz.mynative.demo03;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

/**

* @author zyz

* @version 1.0

* @data 2023/2/15 16:11

* @Description:

*/

public class ThreadPool implements Runnable {

public static void main(String[] args) {

ExecutorService pool = Executors.newFixedThreadPool(2);

ThreadPool threadPool = new ThreadPool("AA");

ThreadPool threadPoo2 = new ThreadPool("BB");

pool.execute(threadPool);

pool.execute(threadPoo2);

pool.shutdown();

}

String name;

public ThreadPool(String name) {

this.name = name;

}

@Override

public void run() {

doSomething();

}

/**

* 需要处理的任务

* */

private void doSomething() {

for (int i = 0; i < 10; i++) {

System.out.println(Thread.currentThread().getName() + "执行" + i + ",name=" + this.name);

}

}

}

4.2 测试结果

资料参考:创建线程池的实现方法