java多线程的创建方式
2016-05-09 09:33
591 查看
根据Thread类中的run方法
public void run() {
if (this.target == null)
return;
this.target.run();
}
可以知道运行多线程代码有两种方式,一种是运行Thread类run方法中的代码,一种是运行target中的run代码。
方法一:运行Thread类run方法中的代码
Thread thread1=new Thread(){
@Override
public void run() {
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
};
thread1.start();
方法二:运行target中的run代码
target是何物,我们来追踪一下:
private Runnable target;
他是Thread类的一个Runnable参数,那么他是如何传参进来的呢?
public Thread(Runnable paramRunnable) {
init(null, paramRunnable, "Thread-" + nextThreadNum(), 0L);
}
通过Thread类构造方法传Runnable进来,再调用init方法
private void init(ThreadGroup paramThreadGroup, Runnable paramRunnable,
String paramString, long paramLong) {
init(paramThreadGroup, paramRunnable, paramString, paramLong, null);
}
这是Thread类的一个私有初始化方法
再调用方法
private void init(ThreadGroup paramThreadGroup, Runnable paramRunnable,
String paramString, long paramLong,
AccessControlContext paramAccessControlContext) {
}
在这个方法里有步骤
this.target = paramRunnable;
从而给target赋值。
改方法创建改多线程方式:
Thread thread2=new Thread(new Runnable(){
@Override
public void run() {
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
});
thread2.start();
那么问题又来了,如果同时存在方法一和方法二的情况,如下代码:
Thread thread3=new Thread(new Runnable(){
@Override
public void run() {
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("run:"+Thread.currentThread().getName());
}
}
}){
public void run() {
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread:"+Thread.currentThread().getName());
}
}
};
thread3.start();
那么该执行哪个代码呢?根据java编程思想,我们知道方法一是覆写了父类的run方法,方法二是父类固有的,所以代码在执行的时候是选择执行子类的run方法,如果子类run方法不存在,才去父类寻找runnable的run方法
public void run() {
if (this.target == null)
return;
this.target.run();
}
可以知道运行多线程代码有两种方式,一种是运行Thread类run方法中的代码,一种是运行target中的run代码。
方法一:运行Thread类run方法中的代码
Thread thread1=new Thread(){
@Override
public void run() {
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
};
thread1.start();
方法二:运行target中的run代码
target是何物,我们来追踪一下:
private Runnable target;
他是Thread类的一个Runnable参数,那么他是如何传参进来的呢?
public Thread(Runnable paramRunnable) {
init(null, paramRunnable, "Thread-" + nextThreadNum(), 0L);
}
通过Thread类构造方法传Runnable进来,再调用init方法
private void init(ThreadGroup paramThreadGroup, Runnable paramRunnable,
String paramString, long paramLong) {
init(paramThreadGroup, paramRunnable, paramString, paramLong, null);
}
这是Thread类的一个私有初始化方法
再调用方法
private void init(ThreadGroup paramThreadGroup, Runnable paramRunnable,
String paramString, long paramLong,
AccessControlContext paramAccessControlContext) {
}
在这个方法里有步骤
this.target = paramRunnable;
从而给target赋值。
改方法创建改多线程方式:
Thread thread2=new Thread(new Runnable(){
@Override
public void run() {
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
});
thread2.start();
那么问题又来了,如果同时存在方法一和方法二的情况,如下代码:
Thread thread3=new Thread(new Runnable(){
@Override
public void run() {
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("run:"+Thread.currentThread().getName());
}
}
}){
public void run() {
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread:"+Thread.currentThread().getName());
}
}
};
thread3.start();
那么该执行哪个代码呢?根据java编程思想,我们知道方法一是覆写了父类的run方法,方法二是父类固有的,所以代码在执行的时候是选择执行子类的run方法,如果子类run方法不存在,才去父类寻找runnable的run方法
相关文章推荐
- Java类加载机制与反射 jvm学习
- Java Web之请求和响应
- JDK源码分析:hashCode()方法
- 如何用Java编写一段代码引发内存泄露
- 常见问题-spring通过反射调用service
- 如何诊断 Java 中的内存泄露
- myeclipse javaWeb项目+JAX-WS webService接口开发
- 这应该是迄今为止最全的一份Java就业指导书
- Eclipse工作视图的背景色更改
- Java Web项目如何提高访问效率
- [置顶] struts2实现文件的下载
- 【SSH网上商城项目实战07】Struts2和Json的整合
- java的static final 和final static区别
- 举例讲解Java的RTTI运行时类型识别机制
- SpringMVC Controller介绍
- 《java入门第一季》之类(Scanner类)
- 《java入门第一季》之类(Scanner类)
- (九)Struts2 防重复提交
- (八)Struts2 文件上传和下载
- J2SE基础之JDK环境变量配置