线程的创建方式
1.继承Thread类
public class ThreadDemo extends Thread {
private String name;
public ThreadDemo(String name){
this.name = name;
}
/**
* 这就是线程执行的逻辑体
*/
@Override
public void run() {
for (int i = 1; i <= 100; i++) {
System.out.println(name+"下载了"+i+"%");
}
}
}
-----------------------------------------------------------------
public static void main(String[] args) {
//创建一个线程的对象
ThreadDemo mt = new ThreadDemo("肖申克的救赎");
//启动一个线程
mt.start();
//创建一个线程的对象
ThreadDemo mt1 = new ThreadDemo("当幸福来敲门");
//启动一个线程
mt1.start();
//System.out.println("方法结束");
}
2.实现Runnable接口
class MyRunnable implements Runnable {
@Override
public void run() {
// 线程执行的逻辑
System.out.println("Thread is running");
}
}
public class Main {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();
}
}
3.实现callable接口
class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
// 线程执行的逻辑
System.out.println("Thread is running");
return 42; // 返回值
}
}
public class Main {
public static void main(String[] args) throws ExecutionException, InterruptedException {
MyCallable myCallable = new MyCallable();
FutureTask<Integer> futureTask = new FutureTask<>(myCallable);
Thread thread = new Thread(futureTask);
thread.start();
// 获取线程执行结果
Integer result = futureTask.get();
System.out.println("Result: " + result);
}
}
比较
| 特性 | 继承Thread类 | 实现Runnable接口 | 实现Callable接口 |
| 线程安全机制 |
无,依赖内部逻辑 |
无,依赖内部逻辑 |
无,依赖内部逻辑 |
| 线程安全实现难度 |
中等,逻辑和控制混合 |
高,共享实例需谨慎同步 |
中等,结合ExecutorService可简化 |
| 共享资源访问 |
需手动同步 |
需手动同步,共享实例需特别注意 |
需手动同步,但ExecutorService提供部分线程安全机制 |
| 适用场景 |
简单任务,少共享资源 |
多线程共享逻辑,需谨慎同步 |
复杂任务,需返回值或异常处理,结合线程池可简化同步 |