两种多线程实现方式区别
1、继承Thread 来生成多线程对象时,我们需要重写 run 方法,因为 Thraed类的run 方法什么也没做
源码分析:
Thread t1= new Thread1();
构造方法:这里的target为空
public Thread() {
init(null, null, "Thread-" + nextThreadNum(), 0);
}
1、当实现Runnable 接口时,这是线程对象的run方法执行的是接口 Runnable 的run 方法
Thread t4= new Thread(new Runnable);
构造方法:这里的target 不为空
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
* 源码实现:
* public Thread(Runnable target) {
* init(null, target, "Thread-" + nextThreadNum(), 0);
* }
```java
private void init(ThreadGroup g, Runnable target, String name,
long stackSize) {
init(g, target, name, stackSize, null);
}
private void init(ThreadGroup g, Runnable target, String name,
long stackSize, AccessControlContext acc) {
if (name == null) {
throw new NullPointerException("name cannot be null");
}
this.name = name.toCharArray();
Thread parent = currentThread();
SecurityManager security = System.getSecurityManager();
if (g == null) {
if (security != null) {
g = security.getThreadGroup();
}
if (g == null) {
g = parent.getThreadGroup();
}
}
g.checkAccess();
if (security != null) {
if (isCCLOverridden(getClass())) {
security.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION);
}
}
g.addUnstarted();
this.group = g;
this.daemon = parent.isDaemon();
this.priority = parent.getPriority();
if (security == null || isCCLOverridden(parent.getClass()))
this.contextClassLoader = parent.getContextClassLoader();
else
this.contextClassLoader = parent.contextClassLoader;
this.inheritedAccessControlContext =
acc != null ? acc : AccessController.getContext();
//请看这里,将构造方法的target 赋值给了 本类的成员变量 target
this.target = target;
setPriority(priority);
if (parent.inheritableThreadLocals != null)
this.inheritableThreadLocals =
ThreadLocal.createInheritedMap(parent.inheritableThreadLocals);
this.stackSize = stackSize;
tid = nextThreadID();
}
//run 方法 如果target为空 什么也不做
@Override
public void run() {
if (target != null) {
target.run();
}
}