Java中创建线程有3种方式,直接上代码。
// 继承Thread类,重写run()方法
public class ThreadTest extends Thread {
private int i;
// 重写run方法
@Override
public void run() {
for (; i < 20; i++) {
System.out.println(getName() + " " + i);
}
}
}
对应的调用方式
new ThreadTest().start();
该方法
- 劣势:已经继承了Thread类,不能再继承其他父类
- 优势:编写简单,访问当前线程可以直接使用this
// 实现Runnable接口,实现run()方法
class ThreadRunnableTest implements Runnable {
private int i;
@Override
public void run() {
for (; i < 20; i++) {
System.out.println(Thread.currentThread().getName() + "" + i);
}
}
}
对应的调用方式
ThreadRunnableTest runnableTest = new ThreadRunnableTest();
new Thread(runnableTest, "thread----1---").start();
该方法优劣势见方法3
// 实现Callable<T>接口,实现call()方法
// 可以设置有返回值,并抛出异常
class ThreadCallableTest implements Callable<Integer> {
// 类似上面的run方法内容
@Override
public Integer call() throws Exception {
int i = 0;
for (; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
}
return i;
}
}
对应的调用方式
ThreadCallableTest threadCallableTest = new ThreadCallableTest();
FutureTask<Integer> task = new FutureTask<Integer>(threadCallableTest);
new Thread(task, "task--1--").start(); // 此处的task作为线程的target
// 打印返回值
try {
System.out.println("task return:" + task.get());
} catch (Exception e) {
e.printStackTrace();
}
该方法
- 优势:实现接口,还可以继承其他类;
多个线程共享同一个target对象,适合多个相同线程来处理同一份资源; - 劣势:编程稍微复杂,如果需要访问当前线程,必须使用
Thread.currentThread()
方法