Java多线程代码行为

时间:2017-11-21 09:21:52

标签: java multithreading

对于以下java代码:

public class Chess implements Runnable {
    public void run() {
        move(Thread.currentThread().getId());
    }

    void move(long id) {
        System.out.print(id + " ");
        System.out.print(id + " ");
    }

    public static void main(String[] args) {
        Chess ch = new Chess();
        new Thread(ch).start();
        new Thread(new Chess()).start();
    }
}

此代码的可能结果之一是 - 输出可能是4 2 4 2(或者是除了4,2之外的其他一些线程ID)。谁能解释我这是怎么可能的?鉴于线程将在“Chess”类的不同实例上运行,我们如何在此处打印不同的id,因为两个S.O.P语句都立即打印id,并且只有这2个线程会调用move方法

2 个答案:

答案 0 :(得分:2)

这并不奇怪。

您正在创建两个线程,每个线程具有不同的ID(在您的情况下分别为2和4)。您正在打印这些ID两次,因此每个ID都会打印两次。

现在解释不同的数字和它们的出现。

订单怎么样?好吧,这就是线程,它们由处理器执行,你无法控制每个处理器指令的执行顺序。

PS:Chess ch = new Chess(); new Thread(ch).start(); new Thread(ch).start(); 个实例的数量无关紧要。如果您要将代码更改为:

        <?php
            $website = $_GET["website"]; //I'm pulling the website from a form
            $contents = file_get_contents($website));
            $del = 'keyword'; 
            $search = preg_quote($del, '/');
            $search = "/^.*$search.*\$/m";
            if(preg_match_all($search, $contents, $found)){
                echo implode("\n", $found[0]);
            }else{}
        ?>

没关系。

答案 1 :(得分:0)

&#34; main&#34;线程始终运行用户创建的线程。在你的情况下&#34; main&#34;线程负责运行, new Thread(ch).start()// thread - 0 new Thread(new Chess())。start(); // thread - 1。

由于上面的线程具有相同的优先级(默认为5),因此ThreadScehduler将调度两个线程同时运行。因此,你得到了两个不同线程的ID。

您可以在Chess类上同步并运行线程,然后您将一次打印一个线程ID。

您可以按照以下方式应用类级别锁定,并一次打印一个ID

public class Chess implements Runnable {
public void run() {
    move(Thread.currentThread().getId());
}

synchronized static void move(long id) {
    System.out.println(id + " ");
    System.out.println(id + " ");

}

public static void main(String[] args) {
    Chess ch = new Chess();
    new Thread(ch).start();
    new Thread(new Chess()).start();
}

}