版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36209121/article/details/77054885
前言
Java中实现多线程的方法大体上有三种, 按照平常的使用来说可以分为两类, 一类是没有返回值的, 另一类是可以获得返回值的, 今天在此总结一下.
一, 不需要获得返回值
a. 继承Thread类:
实现多线程的步骤
- 让其继承Thread类;
- 然后重写其中的run方法;
- 实现该类的对象;
- 调用该对象的start方法, 启动线程;
- 一个线程对象代表这一个线程, 如果要启动多条线程, 请实现多个对象
代码如下:
public class ThreadMain01 {
public static void main(String[] args) {
ThreadTest t1 = new ThreadTest("01");
ThreadTest t2 = new ThreadTest("02");
t1.start();
t2.start();
}
}
class ThreadTest extends Thread {
ThreadTest() {}
ThreadTest(String name) {
setName(name);
}
public void run() {
System.out.println(getName()+" -- is running");
}
}
b. 实现Runnable接口:
其实看源码可以知道, Thread类就是实现了Runnable接口重写了其中的run方法, 推荐使用这种方法, 减少了代码的耦合性.
实现步骤:
- 实现Runnable接口, 重写run方法;
- 创建一个实例对象;
- 创建一个Thread的实例对象, 并将Runnable的子类对象作为参数, 传入到Thread的实例对象中;
- Thread对象调用start方法启动线程,
代码如下
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadMain02 {
public static void main(String[] args) {
ThreadRunnable01 tr = new ThreadRunnable01();
new Thread(tr).start();
new Thread(tr).start();
}
}
class ThreadRunnable01 implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" -- is running");
}
}
上面是一种通过Thread类来实现多线程的实现步骤, 在平常的使用中我们通常使用线程池来开启多线程, 下面就用到了Executor框架;
- 实现Runnable接口, 重写run方法;
- 创建线程池, 获得 ExecutorService 对象;
- 执行execute方法, 或者submit方法(Runnable的子类对象作为参数传入), 每调用一次相当于调用了一条新的线程执行任务;
代码如下
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadMain02 {
public static void main(String[] args) {
ThreadRunnable01 tr = new ThreadRunnable01();
new Thread(tr).start();
new Thread(tr).start();
ExecutorService exe = Executors.newFixedThreadPool(5);
for(int i=0; i<5; i++) {
//exe.submit(tr);
exe.execute(tr);
}
}
}
class ThreadRunnable01 implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" -- is running");
}
}