Thread类与多线程

首先是ThreadA类,继承了Thread,重写了run().

package cn.wiz.roc.thread;

public class ThreadA extends Thread {
    public ThreadA(String name) {
        super(name);
    }

    public synchronized void run() {
        try {
            for (int i = 0; i < 100; i++) {
                System.out.println(this.getName() + ":" + i);
                if (i % 3 == 0)
                    //每隔3的时候线程休眠1000ms
                    Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

ThreadB类似:

package cn.wiz.roc.thread;

public class ThreadB extends Thread {
    public ThreadB(String name) {
        super(name);
    }

    public synchronized void run() {
        try {
            for (int i = 0; i < 100; i++) {
                System.out.println(this.getName() + ":" + i);
                // i能被4整除时,休眠100毫秒
                if (i % 4 == 0)
                    Thread.sleep(1500);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

SleepTest.java

package cn.wiz.roc.thread;

public class SleepTest {
    public static void main(String[] args) {
        ThreadA t1 = new ThreadA("A");
        ThreadB t2 = new ThreadB("B");
        t1.start();
        t2.start();
    }
}

其中一段执行结果:

...
A:16
A:17
A:18
A:19
A:20
A:21
B:17
B:18
B:19
B:20
...

对于多线程环境,start()方法会通过底层的API执行重写的run()方法,使该方法获得竞争CPU计算的能力。在方法的执行过程中,原来的调用环境依次往下执行,不会等待run()方法执行结束。
run()的过程里,可以调用Thread.sleep(1000);使得线程休眠。当然,Thread还有其他几个方法,在此不再赘述。
–Roc


Thread.sleep()和Thread.currentThread().sleep()区别

线程可以用继承Thread类或者实现Runnable接口来实现.

Thread.sleep()是Thread类的方法,只对当前线程起作用,睡眠一段时间.

如果线程是通过继承Thread实现的话这2个方法没有区别;

如果线程是通过实现Runnable接口来实现的,则不是Thread类,不能直接使用Thread.sleep()

必须使用Thread.currentThread()来得到当前线程的引用才可以调用sleep(),

所以要用Thread.currentThread().sleep()来睡眠…

坚持原创技术分享,您的支持将鼓励我继续创作!