有人能解释一下这个节目吗?我们不能启动一个线程两次,但我们得到的输出是1-20。。有人能解释一下吗? import java.io.IOException; 公共类测试实现可运行{ 私有int m,n; 公共同步的无效运行(){ 试一试{ 对于(int i=0;i
正确的做法是不能启动同一线程两次。但你不是在这里这么做的。您将启动两个独立的线程,每个线程启动一次 您的代码基本上与以下代码相同:有人能解释一下这个节目吗?我们不能启动一个线程两次,但我们得到的输出是1-20。。有人能解释一下吗? import java.io.IOException; 公共类测试实现可运行{ 私有int m,n; 公共同步的无效运行(){ 试一试{ 对于(int i=0;i,java,multithreading,Java,Multithreading,正确的做法是不能启动同一线程两次。但你不是在这里这么做的。您将启动两个独立的线程,每个线程启动一次 您的代码基本上与以下代码相同: import java.io.IOException; public class Test implements Runnable { private int m, n; public synchronized void run() { try { for (int i = 0; i < 10; i+
import java.io.IOException;
public class Test implements Runnable {
private int m, n;
public synchronized void run() {
try {
for (int i = 0; i < 10; i++) {
m++;
n++;
Thread.sleep(100);
System.out.println(m + ", " + n);
}
} catch (InterruptedException e) {
}
}
public static void main(String[] args) {
try {
Test a = new Test();
new Thread(a).start();
new Thread(a).start();
} catch (Exception e) {
}
}
}
你是正确的,你不能启动同一个线程两次。但你不是在这里这么做的。您将启动两个独立的线程,每个线程启动一次 您的代码基本上与以下代码相同:
import java.io.IOException;
public class Test implements Runnable {
private int m, n;
public synchronized void run() {
try {
for (int i = 0; i < 10; i++) {
m++;
n++;
Thread.sleep(100);
System.out.println(m + ", " + n);
}
} catch (InterruptedException e) {
}
}
public static void main(String[] args) {
try {
Test a = new Test();
new Thread(a).start();
new Thread(a).start();
} catch (Exception e) {
}
}
}
您正在声明两个不同的线程并一个接一个地运行它们。如果您添加以下代码
Thread t1 = new Thread(a);
t1.start();
Thread t2 = new Thread(a);
t2.start();
public synchronized void run(){
System.out.println(“线程启动”);
试一试{
对于(int i=0;i<10;i++){
m++;
n++;
睡眠(100);
系统输出println(m+“,”+n);
}
}捕捉(中断异常e){
}
System.out.println(“螺纹精加工”);
}
您可以很容易地看到第一个线程的结束位置,然后第二个线程的开始位置。您正在声明两个不同的线程并一个接一个地运行它们。如果您添加以下代码
Thread t1 = new Thread(a);
t1.start();
Thread t2 = new Thread(a);
t2.start();
public synchronized void run(){
System.out.println(“线程启动”);
试一试{
对于(int i=0;i<10;i++){
m++;
n++;
睡眠(100);
系统输出println(m+“,”+n);
}
}捕捉(中断异常e){
}
System.out.println(“螺纹精加工”);
}
您可以很容易地看到第一个线程的结束位置,然后第二个线程的开始位置。您的每个线程都需要执行
Test
类实例中描述的任务。更准确地说,它的run
方法。在您的情况下,两个线程都需要执行Test
任务,但它们还需要使用此类的相同实例(存储在a
引用中)
问题是,run
方法是同步的,这意味着它使用当前实例的监视器/锁(此
-可通过a
引用获得),这意味着两个线程不能同时执行它。更准确地说,其中一个线程需要等待,直到另一个线程完成该同步块(即run
的整个主体)中的代码执行
那么你的情况呢
- 您的一个线程将打印
- 输入同步块锁定在
a
- 打印范围为1-10的值
- 退出已锁定的同步块
a
- 输入同步块锁定在
- 因此,现在可以使用另一个线程
- 输入同步块锁定在
a
- 打印范围为11-20的值(因为
和m
将在循环中每次增加)n
- 退出已锁定的同步块
a
- 输入同步块锁定在
Test
类实例中描述的任务。更准确地说,它的run
方法。在您的情况下,两个线程都需要执行Test
任务,但它们还需要使用此类的相同实例(存储在a
引用中)
问题是,run
方法是同步的,这意味着它使用当前实例的监视器/锁(此
-可通过a
引用获得),这意味着两个线程不能同时执行它。更准确地说,其中一个线程需要等待,直到另一个线程完成该同步块(即run
的整个主体)中的代码执行
那么你的情况呢
- 您的一个线程将打印
- 输入同步块锁定在
a
- 打印范围为1-10的值
- 退出已锁定的同步块
a
- 输入同步块锁定在
- 因此,现在可以使用另一个线程
- 输入同步块锁定在
a
- 打印范围为11-20的值(因为
和m
将在循环中每次增加)n
- 退出已锁定的同步块
a
- 输入同步块锁定在