run()方法的一个疑问【转载】
2010-08-04 13:48
344 查看
线程类
public class MyRunnable implements Runnable{
int i =0;
public void run(){
for(;i<30;i++){
System.out.println("x========"+Thread.currentThread().getName());
}
}
}
调用线程类
public class TestThread {
public static void main(String[] args) {
Thread ttt = new Thread(new MyRunnable());
ttt.run//注意这句
Thread t =new Thread(new MyRunnable());
t.start();//注意这句
TestThread tt= new TestThread();
for(int i =0;i<5;i++){
System.out.println("main====="+Thread.currentThread().getName());
}
}
}
运行结果:
x========main//调用 MyRunnable 的run()方法的运行结果
x========main
x========main
x========main
x========main
main=======main//主线程的运行结果
main=======main
main=======main
main=======main
main=======main
x========Thread-0//调用 MyRunnable 的start()方法的运行结果
x========Thread-0
x========Thread-0
x========Thread-0
x========Thread-0
这个有点不理解, 但也算是发现了点问题
希望大家看看
1你观察代码的效果,通过这个效果你可以推论出ttt.run()只不过执行了ttt的run()的代码,并没有从新开启一个新线程,他使用的仍然是main方法这个线程,虽然了运行了代码,并没有把线程的作用体现出来!
2:而线程调用start()方法首先是开启一个新的线程,在新的线程调用run()方法
不知道这样说你能否理解?
线程的启动是比较复杂的,需要为线程分配资源,它的START方法被调用时系统才会为线程分配资源。
你上面调用线程的run方法只能算普通的方法调用一样,得运行完run里面的代码整个程序才能往下进行,而如果调用start方法,线程和MAIN方法就会抢资源,打印的语句会交替出现,你把线程里的循环次数加到300,试一下依次调run、start和两次都调start方法时所出现的情况应该能看出点端倪~~~
不调用start方法就是不新建一个线程。run方法里只是你想在线程里做什么。
看你的代码:
1.Thread对象的run()方法在一种循环下,使线程一直运行,直到不满足条件为止,在你的main()里创建并运行了一些线程,调用Thread类的start()方法将为线程执行特殊的初始化的过程,来配置线程,然后由线程执行机制调用run()。如果你不调用start()线程就不会启动。
2. ttt.run();你的这句话只是把run()当做了一个普通的方法。
3.因为线程调度机制的行为是不确定的,所以每次运行该程序都会有不同的结果,你可以把你的循环次数增多些,然后看看执行的结果,你会发现main()的线程和Thread1是交替运行的。
4.还有就是尽管线程的调度顺序是不固定的,但是如果有很多线程被阻塞等待运行,调度程序将会让优先级高的线程先执行,而优先级低的线程执行的频率会低一些。
public class MyRunnable implements Runnable{
int i =0;
public void run(){
for(;i<30;i++){
System.out.println("x========"+Thread.currentThread().getName());
}
}
}
调用线程类
public class TestThread {
public static void main(String[] args) {
Thread ttt = new Thread(new MyRunnable());
ttt.run//注意这句
Thread t =new Thread(new MyRunnable());
t.start();//注意这句
TestThread tt= new TestThread();
for(int i =0;i<5;i++){
System.out.println("main====="+Thread.currentThread().getName());
}
}
}
运行结果:
x========main//调用 MyRunnable 的run()方法的运行结果
x========main
x========main
x========main
x========main
main=======main//主线程的运行结果
main=======main
main=======main
main=======main
main=======main
x========Thread-0//调用 MyRunnable 的start()方法的运行结果
x========Thread-0
x========Thread-0
x========Thread-0
x========Thread-0
这个有点不理解, 但也算是发现了点问题
希望大家看看
1你观察代码的效果,通过这个效果你可以推论出ttt.run()只不过执行了ttt的run()的代码,并没有从新开启一个新线程,他使用的仍然是main方法这个线程,虽然了运行了代码,并没有把线程的作用体现出来!
2:而线程调用start()方法首先是开启一个新的线程,在新的线程调用run()方法
不知道这样说你能否理解?
线程的启动是比较复杂的,需要为线程分配资源,它的START方法被调用时系统才会为线程分配资源。
你上面调用线程的run方法只能算普通的方法调用一样,得运行完run里面的代码整个程序才能往下进行,而如果调用start方法,线程和MAIN方法就会抢资源,打印的语句会交替出现,你把线程里的循环次数加到300,试一下依次调run、start和两次都调start方法时所出现的情况应该能看出点端倪~~~
不调用start方法就是不新建一个线程。run方法里只是你想在线程里做什么。
看你的代码:
1.Thread对象的run()方法在一种循环下,使线程一直运行,直到不满足条件为止,在你的main()里创建并运行了一些线程,调用Thread类的start()方法将为线程执行特殊的初始化的过程,来配置线程,然后由线程执行机制调用run()。如果你不调用start()线程就不会启动。
2. ttt.run();你的这句话只是把run()当做了一个普通的方法。
3.因为线程调度机制的行为是不确定的,所以每次运行该程序都会有不同的结果,你可以把你的循环次数增多些,然后看看执行的结果,你会发现main()的线程和Thread1是交替运行的。
4.还有就是尽管线程的调度顺序是不固定的,但是如果有很多线程被阻塞等待运行,调度程序将会让优先级高的线程先执行,而优先级低的线程执行的频率会低一些。
相关文章推荐
- Fedora 17 安装显卡驱动正确方法(纠正网上的一个方法 —— 因此为原创 + 转载)
- [转载]一个Spectral Clustering方法的小结
- java,定义一个Thread类的继承类,并覆盖run方法,在run方法中每隔100毫秒打出一句话
- 初始化了一个没有run()方法的线程类,是否会出错? (安邦)
- IIS启动,就自动执行一个WCF服务方法的解决方案实现的疑问?
- (转载)一个大家不常用到,却很有用的页面间传值方法(Context.Handler)
- Java牛角尖【008】: 可以通过调用一个线程的run方法启动一个线程吗?
- C#程序多用户只启动一个进程的方法[转载]
- “error LNK1169: 找到一个或多个多重定义的符号”的解决方法(转载)
- linux编译引用一个或多个第三方jar包方法(总结转载)
- 转载一个ubuntu环境变量设置方法,这里保留一下
- indexOf方法的一个疑问
- C#程序多用户只启动一个进程的方法[转载]
- NHibernate中使用Equals方法的一个疑问
- javascript(jquery)中判断一个元素在页面中是否存在的方法(转载-来自CSDN)
- 用Regex类计算一个字符串出现次数是最好方法【转载】
- 转载一个thinkphp 删除文件以及目录的方法
- session跨域问题解决方案(转载,其中试验一个方法,成功)
- [转载]如何在MDI中使子窗体只保留一个实例(反射方法)
- (转载和原创)关于解决C++“error LNK1169: 找到一个或多个多重定义的符号”的解决方法