日期:2014-05-20  浏览次数:20780 次

本人初学java SE 线程知识。。求解呀!!!
class MyThread implements Runnable // 实现Runable接口
{
public void run() //重写run()方法
{
for(int i=0;i<3;i++)
{
System.out.println(Thread.currentThread().getName()+"运行,i="+i);
}
}
}
public class CurrentThreadDemo
{
public static void main(String args[])
{
  MyThread a=new MyThread(); //创建对象
new Thread(a,"张三").start(); //启动线程
  a.run(); //运行的是Main的线程

}

}
我想问为什么继承Runable接口的类a的线程与a.run()调用的主方法的线程抢CPU,前者抢不过后者。???明明先执行的start()执行起来。。却在main()方法的后面。。。请各位大哥帮忙助呀!!!

------解决方案--------------------
虽然先执行的是“new Thread(a,"张三").start(); //启动线程”,但是这句执行了后,这个“张三”的线程就由jvm来调度了,先是进入就绪状态,等待jvm调度运行。这个通常都慢于主线程(紧接着的语句)的运行。
楼主可以让主线程在“张三”start()后,休眠一会儿,Thread.sleep(n); n 选几个数比如,1,2,5,10,20,分别运行,再观察结果。
------解决方案--------------------
主线程 优先于 其他线程 sleep 他还没学到吧?
------解决方案--------------------
线程常用操作方法

start //启动线程
interrupt //强制终止线程
setName //设置线程名称
getName //取得线程名称
currentThread //当前线程
isAlive //线程状态
sleep //线程休眠
join //强制运行该线程
MAX_PRIORITY MIN_PRIORITY NORM_PRIORITY //线程的优先级
synchronized 同步操作 // 

线程有2种启动方式 
实现Runnable 接口 和 继承 Thread 类
通常情况下 一般使用继承接口 
因为接口可以被 多实现
并且 实现接口 可以共享资源 使程序更安全 更健壮 
 
希望对楼主学习线程 有帮助
------解决方案--------------------
探讨
虽然先执行的是“new Thread(a,"张三").start(); //启动线程”,但是这句执行了后,这个“张三”的线程就由jvm来调度了,先是进入就绪状态,等待jvm调度运行。这个通常都慢于主线程(紧接着的语句)的运行。
楼主可以让主线程在“张三”start()后,休眠一会儿,Thread.sleep(n); n 选几个数比如,1,2,5,10,20,分别运行,再观察结果。

------解决方案--------------------
探讨

额。。。原来是这样子呀、、受教了。。那我想问一下为什么线程对象可以多次调用run()方法,而不可以多次调用start()方法,执行start()方法不是调用了run()方法吗。。为什么这样操作不会报错了。???

------解决方案--------------------
看大学课本《操作系统》,里面有进程线程的调度机制,大致都差不多
------解决方案--------------------

这个可以试试看,然后我想说的是线程是有优先权的,跟具体的调用过程有关,还有主线程永远是优先于其他线程的,这个意思是如果线程被kill掉 ,主线程是最后一个beikill的



探讨

虽然先执行的是“new Thread(a,"张三").start(); //启动线程”,但是这句执行了后,这个“张三”的线程就由jvm来调度了,先是进入就绪状态,等待jvm调度运行。这个通常都慢于主线程(紧接着的语句)的运行。
楼主可以让主线程在“张三”start()后,休眠一会儿,Thread.sleep(n); n 选几个数比如,1,2,5,10,20,分别运行,再观察结果。