这是我的代码:
public class thread1 implements Runnable {
public static void main(String[] args) {
thread1 d = new thread1();
new Thread(d).start();
Thread t1 = new Thread(d);
t1.start();
}
@Override
public void run() {
for (int i = 0; i < 3; i++) {
sleep1(i);
sleep2(i);
}
}
public void sleep1(int i) {
try {
Thread.sleep(1000);
System.out.println("sleep 1 and i= " + i);
} catch (Exception e) {
e.printStackTrace();
}
}
public synchronized void sleep2(int i) {
try {
Thread.sleep(1000);
System.out.println("sleep 2 and i= " + i);
} catch (Exception e) {
e.printStackTrace();
}
}
}
这是我的输出:
sleep 1 and i= 0
sleep 1 and i= 0
sleep 2 and i= 0
sleep 2 and i= 0
sleep 1 and i= 1
sleep 1 and i= 1
sleep 2 and i= 1
sleep 1 and i= 2
sleep 2 and i= 1
sleep 2 and i= 2
sleep 1 and i= 2
sleep 2 and i= 2
为什么在每个特定的睡眠中都有一个额外的重复和我。
例如:
sleep 1 and i= 0
sleep 1 and i= 0
为什么?
如何清楚地确定一次运行哪个线程以及何时切换到另一个线程?
修改
我将sleep1()
更改为synchronized
,输出为:(两种方法同步)
sleep 1 and i= 0
sleep 2 and i= 0
sleep 1 and i= 0
sleep 2 and i= 0
sleep 1 and i= 1
sleep 1 and i= 1
sleep 2 and i= 1
sleep 1 and i= 2
sleep 2 and i= 2
sleep 2 and i= 1
sleep 1 and i= 2
sleep 2 and i= 2
我知道synchronized
方法无法同时运行,但这是如何发生的?
答案 0 :(得分:4)
你正在开始两个线程
new Thread(d).start(); // one here
Thread t1 = new Thread(d);
t1.start(); // another here
具有相同的对象。两个线程都将执行d.run()
。换句话说,两者都会调用sleep1
,其值i
等于1
。
如何清楚地确定一次运行哪个线程 切换到另一个线程时?
您可以通过检查主题的名称来查找,但不应该。线程不应该知道自己。这只是为了运行您提供的代码。