1)join线程
可以使用join()将一个大问题划分为若干小问题,每一个小问题分配一个线程。当执行该方法时,调用线程将被阻塞,直到被加入的线程执行结束再执行调用线程。

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

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(getName() + " " + i);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        new JoinThread("new Thread").start();
        for (int i = 0; i < 100; i++) {
            if (i == 20) {
                JoinThread jt = new JoinThread("Joined Thread");
                jt.start();
                jt.join();
            }
            System.out.println(Thread.currentThread().getName() + " " + i);
        }
    }
}

2)Daemon线程

Daemon线程是守护线程,比如JVM的垃圾回收线程,如果前台线程都死亡了,它也会死亡。前台线程创建的线程默认也是前台线程,后台线程创建的线程默认是后台线程,可以通过setDaemon()进行更改。

public class DaemonThread extends Thread {
    public void run() {
        for (int i = 0; i < 1000; i++) {
            System.out.println(getName() + " " + i);
        }
    }

    public static void main(String[] args) {
        DaemonThread t = new DaemonThread();
        t.setDaemon(true);
        t.start();
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + " " + i);
        }
    }
}

3)线程睡眠

public class SleepTest {
    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + " " + i);
            Thread.sleep(1000);
        }
    }
}

执行上面代码每隔1s输出一次。

4)线程让步

当某个线程调用yield()方法后,该线程将进入到就绪状态,与比该线程优先级更高或者相同的线程争夺cpu资源,而比其优先级低的线程并不会得到cpu资源。在多cpu环境下,yield()方法有时候效果不是很理想,基于可移植性的考虑,不建议使用yield()。

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

    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(getName() + " " + i);
            if (i == 20) {
                Thread.yield();
            }
        }
    }

    public static void main(String[] args) {
        YieldTest yt1 = new YieldTest("superior thread");
        YieldTest yt2 = new YieldTest("primary thread");
        yt1.setPriority(Thread.MAX_PRIORITY);
        yt2.setPriority(Thread.MIN_PRIORITY);
        yt1.start();
        yt2.start();
    }
}