对于以下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方法
答案 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();
}
}