多线程输出说明

时间:2014-02-19 16:04:04

标签: java multithreading

这是我的代码:

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方法无法同时运行,但这是如何发生的?

1 个答案:

答案 0 :(得分:4)

你正在开始两个线程

new Thread(d).start(); // one here
Thread t1 = new Thread(d);
t1.start(); // another here

具有相同的对象。两个线程都将执行d.run()。换句话说,两者都会调用sleep1,其值i等于1

  

如何清楚地确定一次运行哪个线程   切换到另一个线程时?

您可以通过检查主题的名称来查找,但不应该。线程不应该知道自己。这只是为了运行您提供的代码。