Java多软件 - 线程总是使用主线程

时间:2014-12-18 16:12:35

标签: java multithreading

这是我第一次使用这个网站......只要告诉我我做错了什么。

Verk3a上课:

package verk3a;

public class Verk3a {

    public static int n = 100;

    public static void main(String[] args) {

        RunMeSumThread Zack = new RunMeSumThread(n);
        RunMeSumThread John = new RunMeSumThread(n);
        RunMeSumThread Konni = new RunMeSumThread(n);

        Zack.start();
        John.start();
        Konni.start();
    }

}

RunMeSumThread上课

package verk3a;

public class RunMeSumThread extends Thread implements Runnable{

    public RunMeSumThread(int n) {
        for (int i = 0; i < n; i++) {
            System.out.print(i);
            System.out.print(" | ");
            System.out.print(Thread.currentThread().getName());
            System.out.println();
        }
    }
}

它总是会回复:

0 | main
1 | main
2 | main
3 | main
4 | main
5 | main
6 | main

等...

我正在尝试让它同时运行多个线程。我做错了什么?

4 个答案:

答案 0 :(得分:5)

您应该在void run方法中实现线程执行的代码。只需将逻辑从类构造函数移动到run方法即可。这是一个例子:

public class RunMeSumThread extends Thread implements Runnable{

    int n;

    public RunMeSumThread(int n) {
        this.n = n;
    }

    @Override
    public void run() {
        for (int i = 0; i < n; i++) {
            System.out.print(i);
            System.out.print(" | ");
            System.out.print(Thread.currentThread().getName());
            System.out.println();
        }
    }
}

此外,对于线程创建,您应该从Thread类扩展或实现Runnable接口,它可以同时执行两者。

如果您从Thread延伸,则无需实施Runnable界面。如果您只实施Runnable,则应创建Thread个实例并传递Runnable的实例。在代码中(根据您的代码改编):

public class RunMeSumThread implements Runnable{
    int n;

    public RunMeSumThread(int n) {
        this.n = n;
    }

    @Override
    public void run() {
        for (int i = 0; i < n; i++) {
            System.out.print(i);
            System.out.print(" | ");
            System.out.print(Thread.currentThread().getName());
            System.out.println();
        }
    }
}

public class Verk3a {
    public static int n = 100;
    public static void main(String[] args) {
        //create a Thread and pass an instance of the class implementing Runnable here
        Thread zack = new Thread(new RunMeSumThread(n));
        Thread john = new Thread(new RunMeSumThread(n));
        Thread konni = new Thread(new RunMeSumThread(n));

        zack.start();
        john.start();
        konni.start();
    }
}

答案 1 :(得分:3)

在您调用线程的start方法之前,并未真正创建新的“线程”(在操作系统级别)。由于您在构造函数中进行打印,因此它总是在主线程上执行。

答案 2 :(得分:0)

您已在构造函数中添加了这些打印件。

        System.out.print(i);
        System.out.print(" | ");
        System.out.print(Thread.currentThread().getName());
        System.out.println();

因此它会在创建对象时打印输出。

注意:在调用方法start之前,它是一个简单的java对象

答案 3 :(得分:0)

应将Runnable的实现传递给Thread的超级构造函数:

public class RunMeSumThread extends Thread
{
    public RunMeSumThread(final int n)
    {
        super(new Runnable()
        {
            @Override
            public void run()
            {
                for (int i = 0; i < n; i++) 
                {
                    System.out.print(i);
                    System.out.print(" | ");
                    System.out.print(Thread.currentThread().getName());
                    System.out.println();
                }
            }
        });
    }
}