class TicketDemo2
{
public static void main(String[] args)
{
Ticket t = new Ticket();//楼主注意看这里,这里创建了一个Ticket对象t
Thread t1 = new Thread(t);//这里把t作为参数传入Thread方法中,runnable类就是这样和Thread类联系起来的
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}作者: 游兴钟 时间: 2012-7-10 17:56
class Demo implements Runnable//1,定义类实现Runnable接口
{
private int num = 0;
public void run()//2,覆盖Runnable接口中的run方法。将线程要运行的代码存放在该run方法中。
{
while(true)
{
System.out.println(Thread.currentThread().getName()+" : "+ num++);
}
}
}
class ThreadDemo
{
public static void main(String[] args)
{
Demo d = new Demo();
Thread t1 = new Thread(d);//3,通过Thread类建立线程对象,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。
t1.start();//4,调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。
我们建立线程无非就是为了运行自己想运行的代码,所以run()就提供了一个让我们存放需要多线程运行代码的地方
而start()的作用仅仅只是为了开启线程作者: 刘源 时间: 2012-7-10 19:08
楼上说的我都知道。毕老师都讲得很清楚。但我想好好理解下,这个runnable和Thread里面的内部run()方法是如何的写的。使Thread既能自己调用run(),又能用runnable的子类通过Thread来使用run()。还是谢谢楼上了。作者: 高原 时间: 2012-7-10 20:19
楼主这个问题提得有深度,上面的同学们回答的都不错,但是,我查看了一下源代码和帮助文档,发现事情好像没那么简单
我们来看看文档中对 start方法 的描述:使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
注意,这里说是java虚拟机调用该线程的 run 方法,并不是start方法去调用 run 方法,上面的同学们都说错了!!!
那这个 start 方法到底干了什么呢?我们来看看源代码:
public synchronized void start() {
/**
* This method is not invoked for the main method thread or "system"
* group threads created/set up by the VM. Any new functionality added
* to this method in the future may have to also be added to the VM.
*
* A zero status value corresponds to state "NEW".
*/
if (threadStatus != 0 || this != me) //start方法没有调用过 run方法
throw new IllegalThreadStateException();
group.add(this);
start0();
if (stopBeforeStart) {
stop0(throwableFromStop);
}
}
/**
* If this thread was constructed using a separate
* <code>Runnable</code> run object, then that
* <code>Runnable</code> object's <code>run</code> method is called;
* otherwise, this method does nothing and returns.
* <p>
* Subclasses of <code>Thread</code> should override this method.
*
* @see #start()
* @see #stop()
* @see #Thread(ThreadGroup, Runnable, String)
*/
public void run() { run方法
if (target != null) {
target.run();
}
}