Java创建线程的方式
1. 继承 extends java.lang.Thread类,或者其子类
- 自定义线程类继承Thread;
- 重写Run()方法,编写线程执行体;
- 创建Thread的子类对象;
- 调用子类对象的start()方法。(
调用该方法后,线程不会立即执行,需要CPU安排调度
)
/**
* 创建多线程:继承Thread 重写run()
*/
public class ThreadTest extends Thread{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("Thread线程:"+i);
}
}
public static void main(String[] args) {
ThreadTest ts=new ThreadTest(); //创建子类对象
ts.start();//调用start()
for (int i = 0; i < 1000; i++) {
System.out.println("main线程:"+i);
}
}
}
执行上述代码:主线程和Thread线程交替输出,说明CPU随机调度执行线程。每个线程都有获取CPU的机会。
不推荐使用该方式创建线程,避免Java单继承的局限。
Java单继承特性,如果已经继承其他类,则不能再继承Thread类。
2. 实现Runnable接口
实现Runnable接口
重写Run()方法
调用Start()方法
public class ThreadTest implements Runnable{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("Thread线程:"+i);
}
}
public static void main(String[] args) {
ThreadTest ts=new ThreadTest();
new Thread(ts).start();//调用start()
for (int i = 0; i < 1000; i++) {
System.out.println("main线程:"+i);
}
}
}
推荐使用该方法创建线程:避免单继承的局限性,方便同一个对线被多个线程使用。
public static void main(String[] args) {
ThreadTest t1=new ThreadTest();
new Thread(t1).start();
ThreadTest t2=new ThreadTest();
new Thread(t2).start();
ThreadTest t3=new ThreadTest();
new Thread(t3).start();
}
3. 实现callable接口
实现callable接口,需要返回值类型
重写call()方法,需要抛出异常
创建FutureTask类
调用Start()方法
get() 获取返回值。
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class ThreadCreateCallable implements Callable {
@Override
public String call() throws Exception {
System.out.println("implement Callable Create Thread");
return "success";
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<String> stringFutureTask = new FutureTask<String>(new ThreadCreateCallable());
Thread thread = new Thread(stringFutureTask);
thread.start();
System.out.println(stringFutureTask.get());//获取返回值
}
}
获取返回值一般需要使用 FutureTask.isDone()方法来判断线程是否执行完。SleepUtils为工具类
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class ThreadCreateCallable implements Callable {
@Override
public String call() throws Exception {
SleepUtils.milliseconds(5000);
System.out.println("implement Callable Create Thread");
return "success";
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<String> stringFutureTask = new FutureTask<String>(new ThreadCreateCallable());
Thread thread = new Thread(stringFutureTask);
thread.start();
for (int i = 0; i < 10; i++) {
if (stringFutureTask.isDone()){
System.out.println("线程执行完毕");
}else {
System.out.println("现成未执行完毕");
SleepUtils.milliseconds(1000);
}
}
System.out.println(stringFutureTask.get());//获取返回值
}
}