文章目录
为什么说本质上只有一种实现线程的方式?
实现 Runnable 接口究竟比继承 Thread 类实现线程好在哪里?
实现 Runnable 接口
public class RunnableThread implements Runnable {
@Override
public void run() {
System.out.println("用实现Runnable接口实现线程");
}
}
继承 Thread 类
public class ExtendsThread extends Thread {
@Override
public void run() {
System.out.println(“用Thread类实现线程");
}
}
线程池创建线程
static class DefaultThreadFactory implements ThreadFactory {
DefaultThreadFactory() {
SecurityManager s = System.getSecurityManager();
group = (s != null) ? s.getThreadGroup() :
Thread.currentThread().getThreadGroup();
namePrefix = "pool-" +
poolNumber.getAndIncrement() +
"-thread-";
}
public Thread newThread(Runnable r) {
Thread t = new Thread(group, r,
namePrefix + threadNumber.getAndIncrement(),
0);
if (t.isDaemon())
t.setDaemon(false);
if (t.getPriority() != Thread.NORM_PRIORITY)
t.setPriority(Thread.NORM_PRIORITY);
return t;
}
}
有返回值的 Callable 创建线程
class CallableTask implements Callable<Integer> {
@Override
public Integer call() throws Exception {
return new Random().nextInt();
}
}
//创建线程池
ExecutorService service = Executors.newFixedThreadPool(10);
//提交任务,并用 Future提交返回结果
Future<Integer> future = service.submit(new CallableTask());
定时器 Timer
class TimerThread extends Thread {
//具体实现
}
实现线程只有一种方式
Thread中的的run()方法
/* What will be run. */
private Runnable target;
@Override
public void run() {
if (target != null) {
target.run();
}
}
实现 Runnable 接口比继承 Thread 类实现线程要好
- 实现了 Runnable 与 Thread 类的解耦,Thread 类负责线程启动和属性设置等内容,权责分明。
- 降低了性能开销。
- Java 语言不支持双继承
所以应该优先选择通过实现 Runnable 接口的方式来创建线程。