线程的start方法剖析
public synchronized void start() {
if (threadStatus!=0) // Thread被构造后的NEW状态,事实上threadStatus这个内部属性为0
throw new IllegalThreadStateException(); // 不能两次启动Thread,否则就会出现IllegalThreadStateException异常。
group.add(this); // 线程启动后将会被加入到一个ThreadGroup中
boolean started = false;
try {
start0(); // JDK的官方文档:※ Causes this thread to begin execution; the Java Virtual Machine calls the run method of this thread.
// 上面这句话的意思是:在开始执行这个线程时,JVM将会调用该线程的run方法,换言之,run方法是被JNI方法start0()调用的。
started = true;
} finally {
try {
if (!started){
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
}
}
}
执行单元
线程的真正的执行逻辑是在run方法中,通常我们会把run方法称为线程的执行单元
。
模板模式在Thread中的应用
其实Thread
的run
和start
就是一个比较典型的模板设计模式,父类编写算法结构代码
,子类实现逻辑细节
public class TemplateMethod {
// 父类编写算法结构代码,
public final void print(String message) {
System.out.println("######befor-add-logic##########");
wrapPrint(message);
System.out.println("######after-add-logic##########");
}
protected void wrapPrint(String message) {
}
public static void main(String[] args) {
// 子类实现逻辑细节
TemplateMethod t1 = new TemplateMethod(){
@Override
protected void wrapPrint(String message) {
System.out.println("*"+message+"*");
}
};
t1.print("Hello Thread");
}
}
策略模式在Thread中的应用
无论是Runnable的run
方法,还是Thread类本身的run
方法,都是想将线程的控制本身
和业务逻辑
的运行分离开来,达到职责分明、功能单一的原则,这一点与GoF设计模式中的策略设计模式
很相似
public interface RowHandler<T> {
T handle(ResultSet rs);
}
public class RecordQuery {
private final Connection connection;
public RecordQuery(Connection connection) {
this.connection = connection;
}
public <T> T query(RowHandler<T> handler, String sql, Object... params) throws SQLException {
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
int index = 1;
for (Object param : params) {
stmt.setObject(index++, param);
}
ResultSet resultSet = stmt.executeQuery();
return handler.handle(resultSet);//①调用RowHandler
}
}
}
上面这段代码的好处是可以用query
方法应对任何数据库的查询,返回结果的不同只会因为你传入RowHandler
的不同而不同,同样RecordQuery
只负责数据的获取,而RowHandler
则负责数据的加工,职责分明,每个类均功能单一 。通过这个简单的示例就类比Thread
和Runnable
之间的关系。
-----------------------------------------------------------------------------读书笔记摘自书名:Java高并发编程详解:多线程与架构设计 作者:汪文君