介绍
Java创建线程的三种方式:
- 直接继承Thread
- 通过Runnable实现
- 通过FutureTask和Callable实现
一、直接继承Thread
方法
定义一个类(比如:FirstThreadTest)继承于 Thread
类。
public class FirstThreadTest extends Thread {
@Override
public void run() {
System.out.println("执行 " + getName() + " 线程");
}
}
使用
FirstThreadTest thread1 = new FirstThreadTest();
thread1.run();
FirstThreadTest thread2 = new FirstThreadTest();
thread2.run();
输出
执行 Thread-0 线程
执行 Thread-1 线程
二、通过Runnable实现
方法
定义一个类(比如:RunnableThreadTest),实现 Runnable
接口。
public class RunnableThreadTest implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; ++i) {
System.out.println("执行 " + Thread.currentThread().getName() + ", i = " + i);
}
}
}
使用
RunnableThreadTest runnableThreadTest = new RunnableThreadTest();
new Thread(runnableThreadTest, "新线程1").start();
new Thread(runnableThreadTest, "新线程2").start();
输出
执行 新线程1, i = 0
执行 新线程2, i = 0
执行 新线程2, i = 1
执行 新线程2, i = 2
执行 新线程2, i = 3
执行 新线程2, i = 4
执行 新线程1, i = 1
执行 新线程2, i = 5
执行 新线程1, i = 2
执行 新线程2, i = 6
执行 新线程1, i = 3
执行 新线程2, i = 7
执行 新线程1, i = 4
执行 新线程1, i = 5
执行 新线程2, i = 8
执行 新线程1, i = 6
执行 新线程1, i = 7
执行 新线程2, i = 9
执行 新线程1, i = 8
执行 新线程1, i = 9
(备注:因为是多线程,输出的结果可能不一定完全一致。)
三、通过FutureTask和Callable实现
方法
定义一个类(比如:CallableThreadTest)实现 Callable
接口。
另外,call
方法具有返回值,执行结束后可将结果返回给调用方。
public class CallableThreadTest implements Callable<Integer> {
@Override
public Integer call() throws Exception {
int i = 0;
for(;i < 10; ++i) {
System.out.println("执行 " + Thread.currentThread().getName() + ",i = " + i);
}
return i;
}
}
使用
CallableThreadTest callableThreadTest = new CallableThreadTest();
FutureTask<Integer> futureTask = new FutureTask<>(callableThreadTest);
new Thread(futureTask, "有返回值的线程").start();
try {
System.out.println("子线程的返回值:" + futureTask.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
输出
执行 有返回值的线程,i = 0
执行 有返回值的线程,i = 1
执行 有返回值的线程,i = 2
执行 有返回值的线程,i = 3
执行 有返回值的线程,i = 4
执行 有返回值的线程,i = 5
执行 有返回值的线程,i = 6
执行 有返回值的线程,i = 7
执行 有返回值的线程,i = 8
执行 有返回值的线程,i = 9
子线程的返回值:10
网友评论