线程与线程类要区分开来。
抽象来说,线程是CPU调度的最小单位,但是线程总要执行代码,这个代码就在线程类里说明(即Thread类)。无论如何,Thread只是一个类,但其功能就是“启动一个线程,运行用户指定的Runnable”。创建一个线程有两种方式:
这两种方法,最后都是调用VMThread.create(this, stacksize)来真正创建一个线程,线程执行的代码在run()方法中指定,这个run()方法其实是接口Runnable的未实现的方法。
class Thread implements Runnable {//Thread也继承接口Runnable,并重写了方法run()
......    
public void run() {
        if (target != null) {
            target.run();//最终还是调用Runnable的run()方法
        }
    }
....
由上可见:让线程执行的代码都应该放到run()方法体中。
线程之间同步有:wait,notify()/notifyAll(),interrupt(),yield()(让出处理器),join()和sleep()。
    public final synchronized void join(long millis)
    throws InterruptedException {
        long base = System.currentTimeMillis();
        long now = 0;
        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }
        if (millis == 0) {
            while (isAlive()) {
                wait(0);//join实际上调用的是wait()(通过传入表示时间的参数)
            }
        } else {
            while (isAlive()) {
                long delay = millis - now;
                if (delay <= 0) {
                    break;
                }
                wait(delay);
                now = System.currentTimeMillis() - base;
            }
        }
    }
原文:http://www.cnblogs.com/littlefishxu/p/3985445.html