为什么并不运行线程?

时间:2014-05-01 09:42:18

标签: java multithreading concurrency parallel-processing

我正在运行一个非常简单的多线程程序

主程序

package javathread;


public class JavaThread {


    public static void main(String[] args) 
    {

        JThread t1 = new JThread(10,1);
        JThread t2 = new JThread(10,2);

        t1.run();
        t2.run();

    }
}

JThread.java

package javathread;

import java.util.Random;

public class JThread implements Runnable
{
    JThread(int limit , int threadno)
    {
        t = new Thread();
        this.limit = limit;
        this.threadno = threadno;

    }

    public void run()
    {
        Random generator = new Random();

        for (int i=0;i<this.limit;i++)
        {
            int num = generator.nextInt();

            System.out.println("Thread " + threadno + " : The num is " + num   );
            try
            {
            Thread.sleep(100);
            }
            catch (InterruptedException ie)
            {

            }
        }

    }




    Thread t;
    private int limit;
    int threadno;
}

我希望两个线程同时/并行运行,类似于这张图片

enter image description here

相反,我得到的是线程1首先运行然后线程2运行

enter image description here

有人可以向我解释为什么会发生这种情况吗?

如何让线程同时运行?

4 个答案:

答案 0 :(得分:5)

因为您拨打了t1.run()t2.run()而不是t1.start()t2.start()

如果您拨打run,则只是正常的方法调用。它就像任何方法一样,直到它完成后才会返回。它不会同时运行任何东西。 run绝对没有什么特别之处。

start是&#34;魔法&#34;您调用以启动另一个线程并在新线程中调用run的方法。 (顺便说一下,调用start也是一种正常的方法调用。它是start内的代码,可以实现神奇的效果)

答案 1 :(得分:2)

请浏览Life Cycle of a Thread

enter image description here

答案 2 :(得分:1)

你没有在线程上运行任何东西,你只需运行Runnable(你的JThread不是一个线程,它只是一个无法使用)。 要在线程上运行,您需要执行以下操作:

new Thread(myRunnable).start();

在Runnable中创建线程什么也不做(就像你在JThread构造函数中所做的那样)。

答案 3 :(得分:0)

因为你应该start()线程, run()它。